📅  最后修改于: 2023-12-03 15:13:38.613000             🧑  作者: Mango
在编写爬虫程序时,使用Beautiful Soup来解析HTML文档是一种常见而且方便的方式。本教程将向你介绍Beautiful Soup的基本用法和一些进阶技巧。
首先,在使用Beautiful Soup之前,我们需要安装它。
在命令行中运行以下命令即可:
pip install beautifulsoup4
假设我们已经从网上下载了一个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>
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等。祝你编写愉快!