Beautiful Soup 简明教程
Beautiful Soup - Specifying the Parser
将 HTML 文档树解析为 BeautifulSoup 类的对象。此类的构造函数需要以 HTML 字符串或指向 HTML 文件的文件对象作为强制参数。构造函数具有所有其他可选参数,其中最重要的为特征。
BeautifulSoup(markup, features)
此处标记为 HTML 字符串或文件对象。features 参数指定要使用的解析器。它可以是特定解析器,例如 “lxml”、“lxml-xml”、“html.parser”或 “html5lib;或要使用的标记类型(“html”、“html5”、“xml”)。
如果未给出 features 参数,Beautiful Soup 会选择已安装的最佳 HTML 解析器。Beautiful Soup 将 lxml 的解析器评为最佳,然后是 html5lib,最后是 Python 的内置解析器。
你可以指定以下任一项 −
要解析的标记类型。Beautiful Soup 目前支持 “html”、“xml”和 “html5”。
要使用的解析器库的名称。当前支持的选项为 “lxml”、“html5lib”和 “html.parser”(Python 的内置 HTML 解析器)。
要安装 lxml 或 html5lib 解析器,请使用命令 −
pip3 install lxml
pip3 install html5lib
这些解析器具有各自的优点和缺点,如下所示 -
Parser: html5lib
Usage − BeautifulSoup(markup, "html5lib")
Disadvantages
-
Very slow
-
External Python dependency
不同的解析器会从同一文档创建不同的解析树。最大的区别在于 HTML 解析器和 XML 解析器之间。下面是一个短文档,已解析为 HTML −
Example
from bs4 import BeautifulSoup
soup = BeautifulSoup("<a><b /></a>", "html.parser")
print (soup)
Output
<a><b></b></a>
空 <b /> 标记不是有效的 HTML。因此,解析器会将其变成 <b></b> 标记对。
现在的同一个文档已解析为 XML。请注意,空 <b /> 标记已保留,并且该文档给出了 XML 声明,而不是被放入 <html> 标记中。
Output
<?xml version="1.0" encoding="utf-8"?>
<a><b/></a>
对于格式良好的 HTML 文档,所有 HTML 解析器都会产生类似的解析树,尽管一个解析器将比另一个解析器更快。
然而,如果 HTML 文档不够完美,那么不同类型的解析器将会产生不同的结果。请参见当用不同的解析器解析 “<a></p>” 时结果有什么不同 −
lxml parser
Example
from bs4 import BeautifulSoup
soup = BeautifulSoup("<a></p>", "lxml")
print (soup)
Output
<html><body><a></a></body></html>
请注意,HTML 中悬空的 </p> 标记会被忽略。