[英]Using lxml.html with broken html entities?
我需要處理一個頁面,該頁面不幸地混合了正確和不正確的 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 沒有轉換為正確的字符。
有什么我可以使用的,所以我從 lxml 的輸出字符串中得到正確的字符,即使是在 htmlentity 損壞的情況下(就像 Firefox 一樣)?
HTML 5 標准指定了一個特定的實體子集,可以在不存在尾隨分號的情況下解析這些實體,因為這些實體在歷史上定義時分號是 optional 。
html.unescape()
函數明確支持這些,使用該函數作為第二遍來清除這個問題:
>>> from html import unescape
>>> unescape("Kristján Víctor")
'Kristján Víctor'
如果您安裝html5lib
那么您可以通過它們的lxml.html.html5parser
模塊(包裝html5lib
自己的html5lib.treebuilders.etree_lxml
適配器)讓 lxml 表現相同:
>>> from lxml.html import html5parser as etree
>>> etree.fromstring("Kristján Víctor").text
'Kristján Víctor'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.