安装
1 | pip3 install beautifulsoup4 |
测试
1 | from bs4 import BeautifulSoup |
官方文档:https://beautifulsoup.readthedocs.io/zh_CN/latest/
使用
1 | from bs4 import BeautifulSoup |
Beautiful Soup 库解析器
各解析器的优缺点可以到官方文档中查看,下面只简单介绍
解析器 | 使用方法 | 条件 |
---|---|---|
bs4 的 HTML 解析器 | BeautifulSoup(mk, ‘html.parser’) | 安装 bs4 库 |
lxml 的 HTML 解析器 | BeautifulSoup(mk, ‘lxml’) | pip install lxml |
lxml 的 XML 解析器 | BeautifulSoup(mk, ‘xml’) | pip install lxml |
html5lib 解析器 | BeautifulSoup(mk, ‘html5lib’) | pip install html5lib |
BeautifulSoup 类的基本元素
基本元素 | 说明 |
---|---|
Tag | 标签,最基本的信息组织单元,分别用 <> 和 </> 标明开头和结尾 |
Name | 标签的名字,格式:Tag.name |
Attributes | 标签的属性,字典形式组织,格式:Tag.attrs |
NavigableString | 标签内非属性字符串,<>…</> 中字符串,格式:Tag.string |
Comment | 标签内字符串的注释部分,一种特殊的 Comment 类型 |
Tag
Tag 对象与 XML 或 HTML 原生文档中的 tag 相同
1 | soup = BeautifulSoup('<b class="boldest">Extremely bold</b>', "html.parser") |
Name
每个 tag 都有自己的名字, 通过 .name
来获取
1 | soup = BeautifulSoup('<b class="boldest">Extremely bold</b>', "html.parser") |
Attributes
一个 tag 可能有很多个属性, tag 的属性操作方法与字典一样
1 | soup = BeautifulSoup('<b class="boldest">Extremely bold</b>', "html.parser") |
NavigableString
tag 中的字符串
1 | soup = BeautifulSoup('<b class="boldest">Extremely bold</b>', "html.parser") |
Comment
文档中的注释部分
1 | markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>" |
遍历文档
示例文档
1 | from bs4 import BeautifulSoup |
标签树子节点遍历
属性 | 说明 |
---|---|
.contents | 子节点的列表,将 Tag 所有儿子节点存入列表 |
.children | 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点 |
.descendants | 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历 |
1 | # 接上面的文档示例 |
标签树父节点遍历
属性 | 说明 |
---|---|
.parent | 节点的父亲标签 |
.parents | 节点先辈标签的迭代类型,用于循环遍历先辈节点 |
1 | print(soup.title.parent) # <head><title>The Dormouse's story</title></head> |
兄弟节点遍历
属性 | 说明 |
---|---|
.next_sibling | 返回按照 HTML 文本顺序的下一个平行节点标签 |
.previous_sibling | 返回按照 HTML 文本顺序的上一个平行节点标签 |
.next_siblings | 迭代类型,返回按照 HTML 文本顺序的后续所有平行节点标签 |
.previous_siblings | 迭代类型,返回按照 HTML 文本顺序的前续所有平行节点标签 |
1 | sibling_soup = BeautifulSoup("<a><b>text1</b><c>text2</c></b></a>", "html.parser") |
基于 bs4 库的 HTML 格式输出
prettify() 方法
1 | soup = BeautifulSoup("<a><b>text1</b><c>text2</c></b></a>", "html.parser") |
搜索文档
find_all()
返回一个列表类型
参数:
name 对标签名称的检索字符串
1
2soup.find_all('a') # 返回所有的标签 a
soup.find_all(['a', 'b']) # 返回所有的标签 a 和 battrs 对标签属性值的检索字符串,可标注属性检索
1
2
3soup.find_all('p', 'course') # 返回所有的标签 p 且属性中包含 course
soup.find_all(id='link') # 返回满足指定属性值的所有标签
soup.find_all(id= re.compile('link')) # 返回满足指定属性值匹配正则的所有标签recursive 是否对子孙全部检索,默认 True
1
soup.find_all('a', recursive = False) # 不对子孙节点进行搜索
string <>…</> 中字符串区域的检索字符串
1
2soup.find_all(string="Python") # 只返回所有等于 Python 的字符串
soup.find_all(string=re.compile('Python')) # 返回所有包含 Python 的字符串
True
True
可以匹配任何值,下面代码查找到所有的 tag, 但是不会返回字符串节点
1 | for tag in soup.find_all(True): |
扩展方法
Tag(..) 等价于 Tag.find_all(..)
soup(..) 等价于 soup.find_all(..)
方法 | 说明 |
---|---|
<>.find() | 搜索且只返回一个结果,同 .find_all() 参数 |
<>.find_parents() | 在先辈节点中搜索,返回列表类型,同 .find_all() 参数 |
<>.find_parent() | 在先辈节点中返回一个结果,同 .find() 参数 |
<>.find_next_siblings() | 在后续平行节点中搜索,返回列表类型,同 .find_all() 参数 |
<>.find_next_sibling() | 在后续平行节点中返回一个结果,同 .find() 参数 |
<>.find_previous_siblings() | 在前序平行节点中搜索,返回列表类型,同 .find_all() 参数 |
<>.find_previous_sibling() | 在前序平行节点中返回一个结果,同 .find() 参数 |
示例
中国大学排名定向爬虫
1 | import requests |