Beautiful Soup - 指定解析器



一个 HTML 文档树被解析成 BeautifulSoup 类的对象。此类的构造函数需要一个强制参数,即 HTML 字符串或指向 html 文件的文件对象。构造函数还有其他可选参数,其中重要的是 features。

BeautifulSoup(markup, features)

这里 markup 是一个 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

这些解析器各有优缺点,如下所示 -

解析器:Python 的 html.parser

用法 - BeautifulSoup(markup, "html.parser")

优点

  • 内置
  • 速度适中
  • 宽容(自 Python 3.2 起)

缺点

  • 速度不如 lxml 快,宽容度不如 html5lib 高。

解析器:lxml 的 HTML 解析器

用法 - BeautifulSoup(markup, "lxml")

优点

  • 非常快
  • 宽容

缺点

  • 外部 C 依赖

解析器:lxml 的 XML 解析器

用法 - BeautifulSoup(markup, "lxml-xml")

或 BeautifulSoup(markup, "xml")

优点

  • 非常快
  • 唯一当前支持的 XML 解析器

缺点

  • 外部 C 依赖

解析器:html5lib

用法 - BeautifulSoup(markup, "html5lib")

优点

  • 极其宽容
  • 以与 Web 浏览器相同的方式解析页面
  • 创建有效的 HTML5

缺点

  • 非常慢
  • 外部 Python 依赖

不同的解析器会从同一文档创建不同的解析树。HTML 解析器和 XML 解析器之间的差异最大。这是一个简短的文档,以 HTML 格式解析 -

示例

from bs4 import BeautifulSoup

soup = BeautifulSoup("<a><b /></a>", "html.parser")
print (soup)

输出

<a><b></b></a>

空的 <b /> 标签不是有效的 HTML。因此,解析器将其转换为 <b></b> 标签对。

现在以 XML 格式解析同一文档。请注意,空 <b /> 标签保持不变,并且该文档被赋予 XML 声明而不是放入 <html> 标签中。

示例

from bs4 import BeautifulSoup

soup = BeautifulSoup("<a><b /></a>", "xml")
print (soup)

输出

<?xml version="1.0" encoding="utf-8"?>
<a><b/></a>

对于格式良好的 HTML 文档,所有 HTML 解析器都会产生类似的解析树,尽管一个解析器会比另一个解析器快。

但是,如果 HTML 文档不完美,则不同类型的解析器将产生不同的结果。请查看当 "<a></p>" 使用不同的解析器解析时结果有何不同 -

lxml 解析器

示例

from bs4 import BeautifulSoup

soup = BeautifulSoup("<a></p>", "lxml")
print (soup)

输出

<html><body><a></a></body></html>

请注意,悬空的 </p> 标签被简单地忽略了。

html5lib 解析器

示例

from bs4 import BeautifulSoup

soup = BeautifulSoup("<a></p>", "html5lib")
print (soup)

输出

<html><head></head><body><a><p></p></a></body></html>

html5lib 将其与一个起始 <p> 标签配对。此解析器还向文档添加了一个空的 <head> 标签。

内置 html 解析器

示例

Built in from bs4 import BeautifulSoup

soup = BeautifulSoup("<a></p>", "html.parser")
print (soup)

输出

<a></a>

此解析器也忽略了结束 </p> 标签。但此解析器没有尝试通过添加 <body> 标签来创建格式良好的 HTML 文档,甚至没有费心添加 <html> 标签。

html5lib 解析器使用 HTML5 标准的一部分的技术,因此它对成为“正确”方式的说法最有依据。

广告

© . All rights reserved.