Python中的 html5lib 和 lxml 解析器
Python中的解析器:
解析只是意味着将一团文本分解成更小而有意义的部分。这种分解取决于特定解析器定义的某些规则和因素。这些解析器的范围可以从逐行解析的原生字符串方法到像html5lib
这样的库,它可以解析 HTML 文档的几乎所有元素,将其分解为不同的标签和片段,这些标签和片段可以针对各种用例进行过滤。
我们将在本文中关注的两个解析器是html5lib
和lxml
。因此,在深入探讨它们的优缺点和差异之前,让我们对这两个库进行概述。
html5lib:一个用于解析 HTML 的纯 Python库。它的设计符合 WHATWG HTML 规范,所有主要的网络浏览器都实现了这一规范。
lxml: C 库libxml2
和libxslt
的 Pythonic 成熟绑定。它的独特之处在于它将这些库的速度和 XML 功能完整性与原生Python API 的简单性结合在一起,大部分兼容但优于众所周知的ElementTree
API。
关键:
由于html5lib
是一个纯 Python 库,因此它具有外部Python依赖项,而作为某些 C 库的绑定的lxml
具有外部 C 依赖项。
优点和缺点:
html5lib :
- 实现受当前浏览器严重影响的 HTML5 解析算法,这意味着您获得与在浏览器上完成的相同的解析文本。
- 由于它使用 HTML5 解析算法,它甚至修复了许多损坏的 HTML,并添加了几个缺少的标签,以完成文本并使其看起来像 HTML 文档。
- 极其宽容。
- 非常慢。为什么?因为它有很多Python代码支持。
lxml:
- 非常快。为什么?因为它有很多 Cython 代码的支持。
- 修复了一些损坏的 HTML,但不足以将其呈现为完整的 HTML 文档。
- 很宽容。
与 Beautifulsoup 的区别:
只是为了突出两个解析器在工作方式和生成树以修复不完美形成的文档方面的区别,我们将采用相同的示例并将其提供给两个解析器。
html5lib
:
from bs4 import BeautifulSoup
soup_html5lib = BeautifulSoup("", "html5lib")
print(soup_html5lib)
输出:
我们发现:
- 打开和关闭
html
标签。 - 打开和关闭
head
标签(空)。 - 打开和关闭
body
标签。 - 打开
p
标签以支持关闭p
标签 - 关闭
li
标签以支持打开li
标签。 - 汤对象的最终文本中没有删除任何标签。
lxml
:
from bs4 import BeautifulSoup
soup_lxml = BeautifulSoup("", "lxml")
print(soup_lxml)
输出:
我们发现:
- 打开和关闭
html
标签。 - 没有
head
标签。 - 打开和关闭
body
标签。 - 关闭
li
标签以支持打开li
标签。 - 缺少
p
标签。
我们可以很容易地观察到两个库在最终的树形成或接收到的文档的解析方面的差异,并发现html5lib
为最终解析的文本提供的完整性。