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

# 创建 bs4 对象
soup = BeautifulSoup(html, 'lxml')

查找

常用的元素查找方法,返回 PageElement​ 对象。

  1. 直接查找
# 查找 div 标签
soup.div

# 查找 title 标签
soup.title
  1. 条件查找
# 查找第一个 div 元素
soup.find('div')

# 查找第一个指定 id 的 div 元素
soup.find('div', id="idValue")

# 查找第一个指定 class 的 div 元素
soup.find('div', class_=["value1", ...])

# 查找第一个指定 属性 的 div 元素
soup.find('div', attrs={"key": "value", ...})
  1. 多个查找
# 查找所有 div 元素
soup.find_all('div')

# 查找所有多个 div、p、... 元素
soup.find_all(['div', 'p', ...])

# 查找前 5 个 div 元素
soup.find_all('div', limit=5)

# 正则匹配
soup.find_all(re.compile(pattern))
  1. CSS选择器查找
# 查找单个
soup.select_one('#idValue')

# 查找多个
soup.select('.classValue')

家族

常用的家族元素查找方法:

  1. 查找父元素
# 返回父元素的 PageElement 对象
pageElement.parent

# 返回父元素的 PageElement迭代器 对象
pageElement.parents
  1. 查找子元素
# 直接获取子元素的 div PageElement 对象
pageElement.div

# 获取子元素的 PageElement迭代器 对象
pageElement.children
  1. 查找兄弟元素
# 获取下一个兄弟元素
sibling = pageElement.find_next_sibling()

属性

常用的属性获取方法:

  1. 直接获取
pageElement["key"]
  1. 通过 attrs​ 获取
pageElement.attrs.get("key")

文本

pageElement.text

速查表

对象类型 作用 特点
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>​)。