BeautifulSoup 笔记¶
BeautifulSoup 是一个用于解析 HTML 和 XML 文档的 Python 库。它能够从这些文档中提取数据,并提供了简单易用的 API 来遍历和搜索文档树。BeautifulSoup 通常与 lxml 或 html.parser 等解析器一起使用,以便处理不规范的 HTML 文档。
与 lxml 相比,BeautifulSoup 提供了更高层次的 API,适合快速提取数据,尤其是对初学者非常友好。
安装与导入¶
在使用 BeautifulSoup 之前,需要先安装它。可以通过以下命令安装:
pip install beautifulsoup4
安装完成后,可以通过以下方式导入:
from bs4 import BeautifulSoup
解析与序列化¶
BeautifulSoup
可以通过以下方式解析 HTML/XML 文档:
BeautifulSoup(doc, 'html.parser')
使用 Python 内置的html.parser
解析器解析 HTML 文档BeautifulSoup(doc, 'lxml')
使用lxml
解析器解析 HTML 文档BeautifulSoup(doc, 'xml')
使用lxml
解析器解析 XML 文档
解析后的结果是一个 BeautifulSoup
对象,可以通过以下方式序列化:
soup.prettify()
将文档格式化为字符串,会自动添加缩进和换行,适合打印或保存str(soup)
或soup.encode()
将文档转换为字符串或字节串
元素操作¶
BeautifulSoup
对象和元素对象(如 Tag
对象)有以下属性和方法:
属性¶
tag.name
元素的标签名tag.string
元素的文本内容。如果元素包含多个子元素,返回None
tag.text
元素及其所有子元素的文本内容tag.attrs
元素的属性字典tag.contents
元素的子节点列表tag.parent
元素的父节点tag.children
元素的子节点迭代器tag.descendants
元素的所有后代节点迭代器tag.next_sibling
元素的下一个兄弟节点tag.next_siblings
元素之后的所有兄弟节点迭代器tag.previous_sibling
元素的上一个兄弟节点tag.previous_siblings
元素之前的所有兄弟节点迭代器
方法¶
tag.get(key, default=None)
获取指定属性的值tag[key]
获取指定属性的值(与get
方法类似)tag.has_attr(key)
检查元素是否具有指定属性tag.find(name=None, attrs={}, recursive=True, string=None, **kwargs)
查找第一个匹配的子元素tag.find_all(name=None, attrs={}, recursive=True, string=None, limit=None, **kwargs)
查找所有匹配的子元素name
标签名attrs
属性字典,用于过滤元素recursive
是否递归查找子元素string
文本内容limit
返回结果的最大数量
tag.select(selector)
使用 CSS 选择器查找元素
CSS 选择器¶
CSS 选择器规定了 CSS 规则会被应用到哪些元素上。BeautifulSoup 提供了 select
方法,可以使用 CSS 选择器查找元素。
基本选择器¶
*
通用选择器,匹配所有元素tag
标签选择器,根据给定的节点名称选择元素.class
类选择器,根据给定的类名选择元素#id
ID 选择器,根据给定的 ID 选择元素,在每个文档中 ID 必须是唯一的[attr]
属性选择器[attr=value]
属性值完全匹配[attr^=value]
属性值以指定值开头[attr$=value]
属性值以指定值结尾[attr*=value]
属性值包含指定值[attr~=value]
属性值包含指定值的一个或多个空格分隔的词
分组选择器¶
可以使用逗号 ,
将多个选择器组合在一起,选择所有能被列表中的任意一个选择器选中的节点。
组合器¶
A B
后代选择器,选择 A 元素的后代 B 元素A > B
子元素选择器,选择 A 元素的直接子元素 BA + B
相邻兄弟选择器,选择 A 元素的下一个兄弟元素 BA ~ B
通用兄弟选择器,选择 A 元素之后的所有兄弟元素 B
伪选择器¶
BeautifulSoup 仅支持伪类选择器,而不支持伪元素选择器。
BeautifulSoup 中常用的伪类选择器有:
:first-child
选择父元素的第一个子元素:last-child
选择父元素的最后一个子元素:nth-child(n)
选择父元素的第 n 个子元素:nth-last-child(n)
选择父元素的倒数第 n 个子元素:only-child
选择父元素的唯一子元素:empty
选择没有子元素的元素:not(selector)
选择不匹配指定选择器的元素:has(selector)
选择包含指定选择器的元素:contains(text)
选择包含指定文本的元素