Python 的 BeautifulSoup4
库是一个用于解析HTML和XML文档的库。它能够从网页中提取数据,生成解析树,从而便于提取、修改和操作网页内容。BeautifulSoup4
提供了简单的方法来导航、搜索和修改解析树,支持多种解析器,如 html.parser
和 lxml
。它广泛应用于网页抓取、数据提取、内容分析等场景,是处理网络数据和实现网络爬虫的重要工具。
pip install beautifulsoup4
可以看见不仅仅安装了beautifulsoup4库还安装了soupsieve
Soupsieve 是一个现代的 CSS 选择器库,专为 Beautiful Soup 4 设计,用于在 Python 环境中使用现代 CSS 选择器进行选择、匹配和过滤 HTML 或 XML 文档 。
from bs4 import BeautifulSoup
html_doc = browser.page_source # 来自selenium的browser
soup = BeautifulSoup(html_doc, 'html.parser')
解析器 | 构建一个BeautifulSoup对象 | 速度 | 优势 | 劣势 |
---|---|---|---|---|
语法 | soup = BeautifulSoup(解析内容,解析器) |
/ | / | / |
python标准库 | soup = BeautifulSoup(html_doc, 'html.parser') |
适中 | Python的内置标准库 | Python 2.7.3or 3.2.2)前的版本中文档容错能力差 |
lxml HTML 解析器 | soup = BeautifulSoup(html_doc, 'lxml') |
快 | 文档容错能力强 | 需要安装C语言库 |
lxml XML 解析器 | soup = BeautifulSoup(html_doc, 'lxml-xml') |
快 | 唯一支持XML的解析器 | 需要安装C语言库 |
lxml XML 解析器 | soup = BeautifulSoup(html_doc, 'xml') |
快 | 唯一支持XML的解析器 | 需要安装C语言库 |
html5lib | soup = BeautifulSoup(html_doc, 'html5lib') |
慢 | 容错好、以浏览器的方式解析文档、生成HTML5格式 | 不依赖外部扩展 |
概念:2个类型
<class 'bs4.element.ResultSet'>
<class 'bs4.element.Tag'>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>标题</title>
</head>
<body>
<div id="div_data">
<h1>我的第一个标题h1</h1>
<p class="p_class">我的第一个段落。p</p>
</div>
<div>
<a>第一个a标签</a>
<a>第二个a标签</a>
<p id="link1"></p>
</div>
</body>
</html>
查改增删 | 方法 | 释义 | 值 |
---|---|---|---|
查 | soup.title |
获取整个title标签字段 | <title>标题</title> |
查 | soup.title.string |
获取title标签的值 | 标题 |
查 | soup.title.name |
获取title标签名称 | title |
查 | soup.title.parent.name |
获取 title 的父级标签名称 | head |
查 | soup.p |
获取第一个p标签字段 | <p class="p_class">我的第一个段落。p</p> |
查 | soup.p['class'] |
获取第一个p中class属性值 | ['p_class'] |
查 | soup.p.get('class') |
获取第一个p中class属性值 | ['p_class'] |
查 | soup.a |
获取第一个a标签字段 | <a>第一个a标签</a> |
查 | soup.find(id="link1") |
获取属性id值为link1的字段 | <p id="link1"></p> |
查 | soup.find_all('a') |
获取所有a标签字段 | [<a>第一个a标签</a>, <a>第二个a标签</a>] |
查 | soup.select("#div_data") |
[<div id="div_data"><h1>我的第一个标题h1</h1><p class="p_class">我的第一个段落。p</p></div>] |
|
查 | soup.select("#div_data")[0] |
<div id="div_data"><h1>我的第一个标题h1</h1><p class="p_class">我的第一个段落。p</p></div> |
|
查 | str(soup.select("#div_data")[0]) |
<div id="div_data"><h1>我的第一个标题h1</h1><p class="p_class">我的第一个段落。p</p></div> |
|
改 | soup.a['class'] = "newClass" |
可以对这些属性和内容等等进行修改 | |
删 | del soup.a['class'] |
还可以对这个属性进行删除 |
# 特征:
# 有[]
page_list = soup.select(".classname") # 获得class里的内容
# page_list类型:<class 'bs4.element.ResultSet'>
for a in page_list[0]: # 可以直接for,[0]是page_list是列表
# 为了不用找来找去
# 建议用这个取值方法
data = a.find_all(name="div", attrs={"class": "class_name"})[0].string
# find_all() # name参数填比较好,返回列表,标签之间的值
# 去掉注释内容
price = soup.find(name="div", attrs={"class": "class_name"})
# price类型:<class 'bs4.element.Tag'>
for element in price(text=lambda text: isinstance(text, Comment)):
element.extract()
price2 = price.string
# 清空.clear()
# 清除标签内的内容(包括子标签和文本)
html = "<html><body><p><a></a></p></body></html>"
soup.p.clear()
# <html><body><p></p></body></html>
# 清空.decompose()
# 清除标签(包括该标签)的内容(包括子标签和文本)
html = "<html><body><p><a></a></p></body></html>"
soup.p.decompose()
# <html><body></body></html>
# 清空.extract()
# 清除标签(包括该标签)的内容(包括子标签和文本)并返回
# 同decompose,但是会返回删除的节点
html = "<html><body><p><a></a></p></body></html>"
p_extract = soup.p.extract()
# <html><body></body></html>
# p_extract:<p><a></a></p>
# 特征
# 无[]
price = price.get_text() # 取值
price = price["id"] # 属性值
price = price["class"] # 属性值
price = price["href"] # 属性值