将 lxml.html 与损坏的 html 实体一起使用?

Using lxml.html with broken html entities?

我需要使用一个页面,不幸的是,该页面混合了正确和不正确的 HTML 实体;例如:

<i>Kristj&aacuten V&iacute;ctor</i>

这在 Firefox 67 中最终得到了正确解释:

... 但是,如果我们这样做 "View Source",Firefox 通过语法颜色指示第一个 HTML 实体有问题:

...确实存在,HTML 实体末尾的分号丢失了 - 然而,Firefox 以某种方式解决了这个问题,并呈现了正确的字符。

现在,如果我尝试在 lxml 中使用它:

#!/usr/bin/env python3

import lxml.html as LH
import lxml.html.clean as LHclean

testhtmlstring = "<i>Kristj&aacuten V&iacute;ctor</i>"

myhtml = LH.fromstring( testhtmlstring )
myhtml = LHclean.clean_html( myhtml )
myitem = myhtml.xpath("//i")[0]
myitemstr = myitem.text_content()
print(myitemstr)

...代码在终端中打印出来 (Ubuntu 18.04):

Kristj&aacuten Víctor

...所以,显然,损坏的 htmlentity 没有转换为正确的字符。

有什么我可以使用的东西,所以即使在 htmlentity 损坏的情况下(如 Firefox 所做的那样),我也可以从 lxml 的输出字符串中获得正确的字符?

HTML5 标准指定了一个特定的实体子集,可以在没有尾随分号的情况下进行解析,因为 these entities were historically defined with the semicolon being optional

html.unescape() function 明确支持这些,使用该函数作为第二遍来清除此问题:

>>> from html import unescape
>>> unescape("Kristj&aacuten Víctor")
'Kristján Víctor'

如果安装 html5lib then you can have lxml behave the same, via their lxml.html.html5parser module (which wraps html5lib's own html5lib.treebuilders.etree_lxml adapter):

>>> from lxml.html import html5parser as etree
>>> etree.fromstring("Kristj&aacuten Víctor").text
'Kristján Víctor'