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元素的文本内容。如果元素包含多个子元素,返回Nonetag.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类选择器,根据给定的类名选择元素#idID 选择器,根据给定的 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)选择包含指定文本的元素