BeautifulSoup模块
# BeautifulSoup模块
# 介绍
BeautifulSoup是一个可以从Html或XML文件中提取数据的Python库,可以实现文档节点的导航、查找、修改等DOM操作。
# 相关对象
# BeautifulSoup对象
当使用Beautiful Soup解析一个HTML或XML文档时,会得到一个BeautifulSoup对象,它代表整个解析后的HTML文档,是最顶层的对象。 它包含了整个文档的全部内容,并提供了操作HTML文档的方法和属性。
可以通过BeautifulSoup对象来访问和搜索文档中的其他对象,如Tag、NavigableString和Comment。
# Tag对象
Tag 对象对应于HTML或XML文档中的标签。例如,在<p>This is a paragraph.</p>中,<p>和</p>是标签,它们会被解析为Tag对象。
每个Tag对象都有名称和属性,可以通过Tag.name和Tag.attrs来访问。
此外,Tag对象还可以包含其他Tag对象、NavigableString对象或Comment对象,这些可以通过Tag.contents和Tag.children等属性来访问。
Tag的属性可以被添加、删除或修改,tag的属性操作方法与字典一样。
# NavigableString对象
NavigableString对象代表标签之间的文本内容。
在上面的例子中,"This is a paragraph."就是一个NavigableString对象。
与普通的Python字符串不同,NavigableString对象可以与文档中的其他部分(如Tag对象)进行交互和搜索。
# Comment对象
Comment对象代表HTML或XML文档中的注释。在HTML中,注释以<!--开始,以-->结束,这些注释在解析时会被转换为Comment对象。
与Tag和NavigableString对象类似,Comment对象也是文档树的一部分,可以通过Beautiful Soup进行搜索和访问。
# 模块使用
# 安装与导入
# 安装
pip install BeautifulSoup4
# 导入
from bs4 import BeautifulSoup
2
3
4
5
# HTML解析器
HTML解释器是把HTML文本转换成可遍历的树形结构的工具,进而可以方便地进行节点查找、属性获取、文本抽取和文档修改。
# lxml解析器安装
pip install lxml
# html5lib解析器安装
pip install html5lib
2
3
4
5
| 解析器 | 使用方法 | 优势 | 劣势 |
|---|---|---|---|
| Python标准库 | BeautifulSoup(markup, "html.parser") | Python的内标准库 执行速度适中 文档容错能力强 | Python 2.7.3 or 3.2.2前的版本容错能力差 |
| lxml HTML解析器 | BeautifulSoup(markup, "lxml") | 速度快 文档容错能力强 | 需要安装C语言库 |
| Ixml XML解析器 | BeautifulSoup(markup, ["lxml-xml"]) BeautifulSoup(markup, "xml") | 速度快 唯一支持XML的解析器 | 需要安装C语言库 |
| html5lib | BeautifulSoup(markup, "html5lib") | 最好的容错性 浏览器的方式解析文档 生成HTML5格式的文档 | 速度慢 不依赖外部扩展 |
# BeautifulSoup对象操作
# 实例化BeautifulSoup对象并解析文档,解析器直接指定名称即可
soup = BeautifulSoup(res.text, "lxml")
2
# Tag对象操作
## 查找标签,可以通过节点路径"soup.标签名.标签名..."进行查找
# head标签
soup.head
# title标签
soup.title
# 第一个p标签下的第一个b标签
soup.p.b
# 查找标签属性值,可以通过"soup.标签名.属性名"获取到属性对应的值
# 第一个a标签的name属性值
soup.a.name
# 第一个p标签下的第一个b标签的name属性值
soup.p.b.name
# 第一个a标签的href属性值
soup.a["href"]
# 第一个a标签的所有属性键值对
soup.a.attrs
# 第一个a标签的class属性值,多值属性的返回类型是list
soup.a["class"]
# 获取当前标签及其子标签的所有文本内容
soup.p.strings
# 获取当前标签的文本内容
soup.p.string
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 文档树操作
# 得到一个迭代器,包含p下所有子节点
soup.p.children
# 得到一个迭代器,包含p下所有的标签(子孙节点)
soup.p.descendants
# a标签的父节点
soup.a.parent
# a标签的所有祖先节点
soup.a.parents
# a标签的下一个兄弟节点
soup.a.next_sibling
# 得到一个迭代器,包含a标签的下面所有兄弟节点
soup.a.next_siblings
# a标签的上一个兄弟节点
soup.a.previous_sibling
# 得到一个迭代器,包含a标签的上面所有兄弟节点
soup.a.previous_sibling
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# find()方法
[soup/tag].find_all() BeautifulSoup或Tag对象的查找方法,会根据参数条件,查找第一个符合的标签对象并返回,未匹配则返回None。
参数同下面的find_all()一样,除了没有limit参数。
# find_all()方法
[soup/tag].find_all() BeautifulSoup或Tag对象的查找方法,会根据参数条件,查找所有符合的标签对象并通过列表返回,未匹配则返回空列表。
常用参数
name:要查找的标签名,可是字符串、正则表达式或列表。若不指定则匹配所有标签。
soup.find_all('a')
attrs:用字典或关键字参数指定标签属性过滤。
soup.find_all('div', attrs={'class':'item'})
*kwargs:关键字过滤属性,与attrs等价。
soup.find_all(href=True)
soup.find_all('span', class_='highlight')class为了避免和python关键字冲突,需要写成
class_
recursive:是否递归搜索子孙节点。True会搜索全部子代(默认),False则只会在直接子节点中查找。
soup.body.find_all('a', recursive=False)
string / text:按标签内部的文字内容过滤,可传字符串、正则或函数。
soup.find_all(text='首页')
limit:限制返回结果的数量。limit=1 的效果等同于find()。
soup.find_all('p', limit=3)
# CSS选择器选择标签
通过soup.select()函数可以实现CSS选择来选择标签。
# 例如:
soup.select("title")
soup.select("body a")
soup.select("p > a")
soup.select('a[href^="http://example.com/"]')
soup.select('#list-2 h1')[0].attrs
soup.select('#list-2 h1')[0].get_text()
2
3
4
5
6
7