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 对象。
对于
Some Table Data在第二个
标签中 .string 会返回 None,而 .text 会返回空的 unicode 对象对于 .string
如果标签只包含文本,则直接返回文本
如果标签包含一个单一的子标签,则返回子标签内容
如果标签不包含标签,或者包含多个标签,则返回 None
如果标签既包含文本,也包含子标签,并且二者文本内容不一致,则返回 None
而对于 .text 则简单很多,会返回子标签及所有文本的级联。
比如
some textmore text
evenmore text
.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