
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的browsersoup = 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"] # 属性值