Python爬虫(三):BeautifulSoup库
1. BeautifulSoup是什么?
BeautifulSoup 是一个 Python 库,专门用来解析 HTML 或 XML 文件,方便我们提取数据。它能把网页源代码转换成树形结构,让我们可以轻松查找、修改内容,并自动处理编码问题(如 Unicode 和 UTF-8)。
支持的解析器
BeautifulSoup 支持多种解析器,不同解析器的速度和容错能力不同:
解析器 | 使用方法 | 优点 | 缺点 |
---|---|---|---|
Python标准库 | BeautifulSoup(html, "html.parser") | 内置,无需安装 | 速度较慢 |
lxml (HTML) | BeautifulSoup(html, "lxml") | 速度快,容错强 | 需要额外安装 |
lxml (XML) | BeautifulSoup(html, "xml") | 唯一支持 XML 的解析器 | 需要额外安装 |
html5lib | BeautifulSoup(html, "html5lib") | 容错最好,像浏览器一样解析 | 速度最慢 |
推荐使用 lxml
,因为它最快!
2. 安装 BeautifulSoup
安装 BeautifulSoup
pip install beautifulsoup4
安装 lxml(推荐)
pip install lxml
安装 html5lib(可选)
pip install html5lib
3. 快速上手
(1)解析 HTML 字符串
from bs4 import BeautifulSouphtml = '''
<!DOCTYPE html>
<html>
<head><title>BeautifulSoup学习</title>
</head>
<body><p>Hello BeautifulSoup</p>
</body>
</html>
'''# 使用 lxml 解析器
soup = BeautifulSoup(html, "lxml")
print(soup.p.text) # 输出: Hello BeautifulSoup
(2)解析本地 HTML 文件
soup = BeautifulSoup(open("index.html"), "lxml")
print(soup.title.text) # 输出网页标题
4. BeautifulSoup 的 4 种对象
(1)Tag(标签)
- 对应 HTML 里的标签,如
<title>
、<p>
。 - 可以获取标签名
.name
和属性.attrs
。
tag = soup.title
print(tag.name) # 输出: title
print(tag.attrs) # 输出: {'class': ['tl']}
(2)NavigableString(文本内容)
- 对应标签里的文本内容,如
<p>Hello</p>
里的"Hello"
。 - 可以用
.string
获取文本。
text = soup.p.string
print(text) # 输出: Hello BeautifulSoup
(3)BeautifulSoup(整个文档)
- 代表整个 HTML 文档,可以看作最大的
Tag
。 - 它的
.name
是[document]
。
print(soup.name) # 输出: [document]
(4)Comment(注释)
- 对应 HTML 注释
<!-- 这是注释 -->
,但.string
会去掉注释符号。
comment = soup.find(text=lambda text: isinstance(text, Comment))
print(comment) # 输出: 这是注释
5. 搜索文档树
(1)find_all()
查找所有匹配的标签
# 查找所有 <a> 标签
links = soup.find_all("a")# 查找 class="elsie" 的所有标签
elsie_tags = soup.find_all(class_="elsie")# 查找 id="link1" 的标签
link1 = soup.find_all(id="link1")# 查找文本包含 "BeautifulSoup" 的标签
text_match = soup.find_all(text="BeautifulSoup")
(2)find()
查找第一个匹配的标签
first_link = soup.find("a") # 返回第一个 <a> 标签
(3)CSS 选择器(推荐!)
# 查找所有 <a> 标签
soup.select("a")# 查找 class="elsie" 的所有标签
soup.select(".elsie")# 查找 id="link1" 的标签
soup.select("#link1")# 查找 body 下的所有 <a> 标签
soup.select("body a")# 查找第一个匹配的标签
soup.select_one(".elsie")
6. 总结
- BeautifulSoup 是 Python 爬虫必备的 HTML/XML 解析库。
- 推荐使用
lxml
解析器,因为它最快。 - 4 种对象:
Tag
、NavigableString
、BeautifulSoup
、Comment
。 - 搜索方法:
find_all()
查找所有匹配的标签find()
查找第一个匹配的标签select()
使用 CSS 选择器(最方便!)