Beautifulsoup
Beautiful Soup4 是一个可以从HTML或XML文件中提取数据的Python库。
它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。Beautiful Soup会帮你节省数小时甚至数天的工作时间。
可以配合 Requests 第三方库实现简单的Web爬虫。
默认使用Python解析器,但是我们可以使用更加强大的 lxml 解析器。
安装
pip install beautifulsoup4 lxml
|
使用
常见解析器:lxml
、html.parser
、 html5lib
。
HTML是由元素构成,元素包含许多的属性以及文本内容,我们可以对这些进行增删改查。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
|
查找
常用的元素查找方法,返回 PageElement
对象。
- 直接查找
- 条件查找
soup.find('div')
soup.find('div', id="idValue")
soup.find('div', class_=["value1", ...])
soup.find('div', attrs={"key": "value", ...})
|
- 多个查找
soup.find_all('div')
soup.find_all(['div', 'p', ...])
soup.find_all('div', limit=5)
soup.find_all(re.compile(pattern))
|
- CSS选择器查找
soup.select_one('#idValue')
soup.select('.classValue')
|
家族
常用的家族元素查找方法:
- 查找父元素
pageElement.parent
pageElement.parents
|
- 查找子元素
pageElement.div
pageElement.children
|
- 查找兄弟元素
sibling = pageElement.find_next_sibling()
|
属性
常用的属性获取方法:
- 直接获取
- 通过
attrs
获取
pageElement.attrs.get("key")
|
文本
速查表
对象类型 |
作用 |
特点 |
BeautifulSoup |
整个文档的入口 |
提供全局操作和搜索功能。 |
PageElement |
基础类 |
所有的文档元素 |
Tag |
单个 HTML/XML 标签 |
提供标签名、属性、内容等操作。 |
NavigableString |
标签中的文本 |
仅表示纯文本,支持替换、操作。 |
Comment |
注释内容 |
属于NavigableString 的子类,存储注释内容。 |
Doctype |
文档类型声明 |
表示<!DOCTYPE> 部分。 |
ResultSet |
find_all() 的返回结果 |
类似列表,包含多个Tag 对象。 |
SoupStrainer |
解析过滤器 |
优化性能,仅解析特定标签。 |
BeautifulSoup
方法/属性 |
描述 |
soup.find(name, attrs) |
查找第一个符合条件的标签元素 |
soup.find_all(name, attrs) |
查找所有符合条件的标签元素(返回列表) |
soup.select(css_selector) |
使用 CSS 选择器查找符合条件的标签元素 |
soup.select_one(css_selector) |
使用 CSS 选择器查找第一个符合条件的标签 |
soup.prettify() |
以格式化方式返回文档结构 |
soup.get_text(separator, strip) |
获取文档中所有的文本内容,支持分隔符和去除多余空白 |
soup.contents |
返回文档的直接子元素列表 |
soup.children |
以生成器形式返回文档的直接子元素 |
soup.descendants |
以生成器形式返回文档的所有子孙元素 |
soup.find_parents(name, attrs) |
查找所有符合条件的父标签元素 |
soup.find_parent(name, attrs) |
查找第一个符合条件的父标签元素 |
soup.find_next(name, attrs) |
查找文档中当前元素之后的第一个符合条件的元素 |
soup.find_all_next(name, attrs) |
查找文档中当前元素之后的所有符合条件的元素 |
soup.find_previous(name, attrs) |
查找文档中当前元素之前的第一个符合条件的元素 |
soup.find_all_previous(name, attrs) |
查找文档中当前元素之前的所有符合条件的元素 |
soup.decompose() |
删除整个文档的内容 |
soup.replace_with(new_tag) |
用新内容替换整个文档 |
soup.new_tag(name, attrs) |
创建新的标签 |
soup.unwrap() |
移除文档中的所有标签,保留文本内容 |
soup.extract() |
提取文档内容 |
soup.stripped_strings |
以生成器形式返回文档中去除多余空白的所有文本 |
soup.is_empty_element() |
检查文档是否为空(无内容) |
PageElement
方法/属性 |
描述 |
element.name |
返回标签名 |
element.attrs |
返回标签的属性字典 |
element['attribute'] |
访问标签的某个属性值 |
element.get('attribute') |
获取标签的某个属性值 |
element.text |
获取标签内的所有文本内容 |
element.string |
获取标签内的第一个直接子节点的字符串 |
element.stripped_strings |
以生成器形式获取标签内的所有文本内容,去除多余空格 |
element.prettify() |
以格式化方式返回标签内容 |
element.contents |
返回标签的所有直接子节点(列表形式) |
element.children |
以生成器形式返回标签的所有直接子节点 |
element.descendants |
以生成器形式返回标签的所有子孙节点 |
element.find() |
查找标签内符合条件的第一个子节点 |
element.find_all() |
查找标签内所有符合条件的子节点(列表形式) |
element.select() |
使用 CSS 选择器查找符合条件的子节点 |
element.find_parent() |
查找标签的第一个符合条件的父节点 |
element.find_parents() |
查找标签的所有符合条件的父节点 |
element.find_next() |
查找标签后第一个符合条件的兄弟节点 |
element.find_all_next() |
查找标签后所有符合条件的兄弟节点 |
element.find_previous() |
查找标签前第一个符合条件的兄弟节点 |
element.find_all_previous() |
查找标签前所有符合条件的兄弟节点 |
element.replace_with(new_element) |
用新内容替换当前标签 |
element.extract() |
从文档树中移除当前标签(但不销毁) |
element.decompose() |
从文档树中删除当前标签及其所有内容(不可恢复) |
element.unwrap() |
移除标签但保留其子节点 |
element.insert(position, new_element) |
在指定位置插入子节点 |
element.insert_before(new_element) |
在当前标签之前插入内容 |
element.insert_after(new_element) |
在当前标签之后插入内容 |
element.has_attr('attribute') |
检查标签是否具有某个属性 |
Tag
方法/属性 |
说明 |
.name |
获取或设置标签的名称。例如:tag.name = "div" 。 |
.attrs |
获取或设置标签的属性字典。例如:tag.attrs["class"] 或tag["id"] 。 |
.string |
获取或设置标签内的文本内容(如果仅有一个子节点)。 |
.text |
获取标签及其所有子节点的纯文本内容(递归提取)。 |
.find(name, attrs, ...) |
搜索第一个符合条件的子标签,常用于精确查找。 |
.find_all(name, attrs, ...) |
搜索所有符合条件的子标签,返回一个列表。 |
.children |
以生成器形式返回当前标签的直接子节点。 |
.contents |
返回当前标签的所有直接子节点,形式为列表。 |
.parent |
获取当前标签的直接父节点。 |
.parents |
返回当前标签的所有祖先节点(生成器形式)。 |
.next_sibling |
获取当前标签的下一个兄弟节点。 |
.previous_sibling |
获取当前标签的上一个兄弟节点。 |
.next_elements |
以生成器形式返回文档中从当前标签开始的所有节点(包括子节点)。 |
.previous_elements |
以生成器形式返回文档中从当前标签逆序开始的所有节点。 |
.extract() |
将当前标签从文档树中移除并返回自身。 |
.decompose() |
将当前标签及其子节点从文档树中移除并销毁。 |
.replace_with(new_tag) |
用指定的新标签替换当前标签。 |
.insert(index, new_tag) |
在当前标签的子节点中插入新的节点。 |
.wrap(wrapper_tag) |
用指定的标签包裹当前标签。 |
.unwrap() |
移除当前标签,但保留其子节点。 |
.clear() |
清空当前标签的内容,保留标签本身。 |
.has_attr(attribute) |
判断标签是否有某个属性,返回布尔值。 |
.get(attribute, default) |
获取指定属性的值,若属性不存在则返回默认值。 |
.set(attribute, value) |
设置标签的某个属性。 |
.class |
获取标签的class 属性(若存在)。 |
.id |
获取标签的id 属性(若存在)。 |
.select(selector) |
使用 CSS 选择器语法查找标签,返回符合条件的子节点列表。 |
.select_one(selector) |
使用 CSS 选择器语法查找第一个符合条件的子节点。 |
.decode() |
返回标签的字符串形式,包括其内容。 |
.encode() |
返回标签的字节形式,常用于处理非 ASCII 文本。 |
.is_empty_element |
判断当前标签是否为空标签(如、<img> )。 |