hand
_1_5_88
4
返回栏目
1k
9k
1k
1k
5k
1k
1k
1k
1k
3k
2k
1k
0.8k
2k
3k
1k
1k
0.7k
0.9k
1k
0.6k
0.4k
0.4k
0.3k
3k
2k
9k
0.4k
0.4k
0.8k
0.5k
3k
5k
1k
2k
2k
3k
5k
1k
1k
0.4k
0.5k
0.4k
0.6k
0.7k
1k
0.4k
0.3k
4k
0.5k
0k
0.3k
0k
0.2k
0.2k
0.3k
0.9k
0.9k
0.1k
0.9k
0.9k
1k
0.5k
6k
0.3k
0.4k
0.7k
0.6k
8k
3k
1k
1k
1k
1k
0k
2k
1k
1k
0.2k
5k
4k
5k
0.4k
0.8k
1k
1k
1k
0.1k
2k
1k
2k
6k
0k
2k
7k
1k
5k
2k
3k
1k
0k
1k
0.9k
0.4k
0.2k
1k
3k
4k
1k
1k
1k
2k
3k
0.7k
0.3k
0.5k
0.6k
1k
0.9k
3k
0.3k
4k
返回python栏目
作者:
贺及楼
成为作者
更新日期:2024-10-28 10:12:35
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"] # 属性值
python
整章节共122节
快分享给你的小伙伴吧 ~