BeautifulSoup4 能够帮助我们从 HTML 或 XML 文件中提取数据

安装

pip install beautifulsoup4
解析器 使用方法 优势 劣势
Python 标准库 BeautifulSoup(markup, “html.parser”) Python 的内置标准库 执行速度适中 文档容错能力强 Python 2.7.3 or 3.2.2) 前 的版本中文档容错能力差
lxml HTML 解析器 BeautifulSoup(markup, “lxml”) 速度快 文档容错能力强 需要安装 C 语言库
lxml XML 解析器 BeautifulSoup(markup, “xml”) 速度快 需要安装 C 语言库
html5lib BeautifulSoup(markup, “html5lib”) 最好的容错性 以浏览器的方式解析文档 生成 HTML5 格式的文档 速度慢 不依赖外部扩展

使用

加载

from bs4 import BeautifulSoup
soup = BeautifulSoup(html)

Beautiful Soup 将复杂 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python 对象,所有对象可以归纳为 4 种:

  • Tag, HTML 中的一个个标签,有 name 和 attr
  • NavigableString,标签中内容
  • BeautifulSoup, 文档全部内容
  • Comment,一个特殊类型的 NavigableString 对象

find_all() 方法和 select() 方法各有各的优劣,find_all 方法能支持正则,而 select 方法可以使用 CSS 属性选择器。

.string 和 .text 区别

Tag 对象上调用 .string 会返回 NavigableString 类型对象,而 .text 会获取所有子节点内容的组合,.text 返回的是 Unicode 对象。

对于

<td>Some Table Data</td>
<td></td>

在第二个 <td> 标签中 .string 会返回 None,而 .text 会返回空的 unicode 对象

对于 .string

  • 如果标签只包含文本,则直接返回文本
  • 如果标签包含一个单一的子标签,则返回子标签内容
  • 如果标签不包含标签,或者包含多个标签,则返回 None
  • 如果标签既包含文本,也包含子标签,并且二者文本内容不一致,则返回 None

而对于 .text 则简单很多,会返回子标签及所有文本的级联。

比如

<td>some text</td>
<td></td>
<td><p>more text</p></td>
<td>even <p>more text</p></td>

.string 会返回

some text
None
more text
None

.text 会返回

some text

more text
even more text

BeautifulSoup 不同解析器比较

BeautifulSoup 支持很多种 HTML 解析器,包括 Python 自带标准库,还有其他 lxml 等等第三方模块。

解析器 使用方法 优点 缺点
html.parser BeautifulSoup(markup,”html.parser”) Python 标准库,速度快,兼容性好(2.7.x 和 3.2.x) 无法在 2.7.3 之前和 3.2.2 之前版本使用
lxml BeautifulSoup(markup, “lxml”) 速度快,兼容性好 外部依赖
lxml’s XML BeautifulSoup(markup, ‘lxml-xml’) 或者 ‘xml’ 速度快,支持 XML 外部依赖
html5lib BeautifulSoup(markup, ‘html5lib’) 兼容性好,HTML5 合法 速度慢,外部依赖

个人一般使用 html.parser 但是如果遇到不兼容版本,那也只能 pip install lxml 然后使用了。

reference