将 lxml.html 与损坏的 html 实体一起使用?
Using lxml.html with broken html entities?
我需要使用一个页面,不幸的是,该页面混合了正确和不正确的 HTML 实体;例如:
<i>Kristján Ví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á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 没有转换为正确的字符。
有什么我可以使用的东西,所以即使在 htmlentity 损坏的情况下(如 Firefox 所做的那样),我也可以从 lxml 的输出字符串中获得正确的字符?
HTML5 标准指定了一个特定的实体子集,可以在没有尾随分号的情况下进行解析,因为 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
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án Víctor").text
'Kristján Víctor'
我需要使用一个页面,不幸的是,该页面混合了正确和不正确的 HTML 实体;例如:
<i>Kristján Ví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á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 没有转换为正确的字符。
有什么我可以使用的东西,所以即使在 htmlentity 损坏的情况下(如 Firefox 所做的那样),我也可以从 lxml 的输出字符串中获得正确的字符?
HTML5 标准指定了一个特定的实体子集,可以在没有尾随分号的情况下进行解析,因为 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
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án Víctor").text
'Kristján Víctor'