📜  Beautiful Soup教程(1)

📅  最后修改于: 2023-12-03 15:13:38.613000             🧑  作者: Mango

Beautiful Soup教程

在编写爬虫程序时,使用Beautiful Soup来解析HTML文档是一种常见而且方便的方式。本教程将向你介绍Beautiful Soup的基本用法和一些进阶技巧。

安装Beautiful Soup

首先,在使用Beautiful Soup之前,我们需要安装它。

在命令行中运行以下命令即可:

pip install beautifulsoup4
使用Beautiful Soup

假设我们已经从网上下载了一个HTML文档,我们要用Beautiful Soup来解析它。下面是一个例子:

from bs4 import BeautifulSoup

html_doc = """
<html>
  <head>
    <title>Beautiful Soup Tutorial</title>
  </head>
  <body>
    <p class='first'>This is the first paragraph.</p>
    <p class='second'>This is the second paragraph.</p>
  </body>
</html>
"""

soup = BeautifulSoup(html_doc, 'html.parser')
print(soup.prettify())

输出结果:

<html>
 <head>
  <title>
   Beautiful Soup Tutorial
  </title>
 </head>
 <body>
  <p class="first">
   This is the first paragraph.
  </p>
  <p class="second">
   This is the second paragraph.
  </p>
 </body>
</html>

在这个例子中,我们先定义了一个HTML文档的字符串,然后用Beautiful Soup的prettify()方法打印出格式漂亮的HTML代码。

我们还可以使用find()find_all()方法来查找特定的标签,例如:

# 找到第一个<p>标签
print(soup.find('p'))

# 找到所有<p>标签
print(soup.find_all('p'))

# 找到class='second'的<p>标签
print(soup.find('p', {'class': 'second'}))

输出结果:

<p class="first">
 This is the first paragraph.
</p>
[<p class="first">
 This is the first paragraph.
</p>, <p class="second">
 This is the second paragraph.
</p>]
<p class="second">
 This is the second paragraph.
</p>
进阶技巧
CSS选择器

Beautiful Soup支持CSS选择器来查找标签。例如,我们可以使用.class选择器来查找class属性为second的标签:

# 找到class='second'的<p>标签
print(soup.select_one('.second'))

输出结果:

<p class="second">
 This is the second paragraph.
</p>

我们还可以使用.class1.class2选择器来同时查找多个class属性:

# 找到同时包含class='first'和class='second'的<p>标签
print(soup.select('.first.second'))

输出结果:

[]

因为我们定义的HTML文档只有一个class为first和一个class为second的标签,因此这个例子的输出为空列表。

爬取网页

使用Beautiful Soup解析HTML文档的最常见的应用场景之一就是爬取网页上的数据。

假设我们要从某个豆瓣电影标签页上爬取电影的信息,例如电影的名称、评分、封面图片等等。我们可以使用Python的requests模块来发送HTTP请求,并使用Beautiful Soup来解析HTML文档。以下是一个例子:

import requests
from bs4 import BeautifulSoup

url = 'https://movie.douban.com/tag/%E6%82%AC%E7%96%91'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299'
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')

for movie in soup.select('.item'):
    name = movie.select_one('.title a').text.strip()
    rate = movie.select_one('.rating_num').text.strip()
    cover_url = movie.select_one('.pic img')['src']
    print(name, rate, cover_url)

在这个例子中,我们定义了一个URL和一个请求头(我们需要伪造一个浏览器的请求头,以防止被豆瓣网站检测到我们是一个机器人),然后使用requests.get()方法发送了一个GET请求,并获取到了响应对象。

然后,我们使用Beautiful Soup来解析这个响应对象的文本内容,使用CSS选择器来获取电影的名称、评分和封面图片的URL,并打印出它们的值。

输出结果:

国际谍影 8.1 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p1517094816.jpg
极智传说 8.3 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2190156816.jpg
SHERLOCK/神探夏洛克 第四季 8.0 https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2406928500.webp
安娜·卡列尼娜 8.5 https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2312992674.webp
...
结论

使用Beautiful Soup解析HTML文档是编写爬虫程序的常见技巧之一。除了基本用法之外,本教程还介绍了一些进阶技巧,例如使用CSS选择器、爬取网页等等。在实际工作中,你可能还需要掌握一些其他的技巧和工具,例如Selenium等。祝你编写愉快!