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

时间:2019-06-16 21:00:09

标签: python lxml.html

我需要处理一个页面,该页面包含正确和错误的HTML实体的不幸组合;例如:

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

在Firefox 67中,它确实得到了正确的解释,最终:

ff-htmlent1.png

...但是,如果我们执行“查看源代码”,则Firefox通过语法颜色指示第一个HTML实体有问题:

ff-htmlent2.png

...实际上,在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没有转换为正确的字符。

是否可以使用某些东西,即使在HTML实体损坏的情况下(如Firefox一样),我也可以从lxml的输出字符串中获取正确的字符?

1 个答案:

答案 0 :(得分:2)

HTML 5标准已经指定了实体的特定子集,因为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,则可以通过它们的lxml.html.html5parser module(包装html5lib自己的html5lib.treebuilders.etree_lxml adapter)使lxml表现相同:

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