我需要处理一个页面,该页面包含正确和错误的HTML实体的不幸组合;例如:
<i>Kristján Víctor</i>
在Firefox 67中,它确实得到了正确的解释,最终:
...但是,如果我们执行“查看源代码”,则Firefox通过语法颜色指示第一个HTML实体有问题:
...实际上,在HTML实体的末尾缺少分号-但是,Firefox以某种方式将其找出来并呈现正确的字符。
现在,如果我尝试在lxml中使用它:
#!/usr/bin/env python3
import lxml.html as LH
import lxml.html.clean as LHclean
testhtmlstring = "<i>Kristján Ví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án Víctor
...因此,显然,破碎的htmlentity没有转换为正确的字符。
是否可以使用某些东西,即使在HTML实体损坏的情况下(如Firefox一样),我也可以从lxml的输出字符串中获取正确的字符?
答案 0 :(得分:2)
HTML 5标准已经指定了实体的特定子集,因为these entities were historically defined with the semicolon being optional可以在不存在尾部分号的情况下对其进行解析。
html.unescape()
function明确支持这些功能,请将该功能作为第二遍操作来解决此问题:
>>> from html import unescape
>>> unescape("Kristján 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án Víctor").text
'Kristján Víctor'