簡體   English   中英

將 lxml.html 與損壞的 html 實體一起使用?

[英]Using lxml.html with broken html entities?

我需要處理一個頁面,該頁面不幸地混合了正確和不正確的 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 沒有轉換為正確的字符。

有什么我可以使用的,所以我從 lxml 的輸出字符串中得到正確的字符,即使是在 htmlentity 損壞的情況下(就像 Firefox 一樣)?

HTML 5 標准指定了一個特定的實體子集,可以在不存在尾隨分號的情況下解析這些實體,因為這些實體在歷史上定義時分號是 optional

html.unescape()函數明確支持這些,使用該函數作為第二遍來清除這個問題:

>>> from html import unescape
>>> unescape("Kristj&aacuten 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&aacuten Víctor").text
'Kristján Víctor'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM