>>> s = '<div> < 20 </div>'
>>> import lxml.html
>>> tree = lxml.html.fromstring(s)
>>> lxml.etree.tostring(tree)
'<div> </div>'
有沒有人知道這方面的解決方法?lxml截斷包含'小於'字符的文本
>>> s = '<div> < 20 </div>'
>>> import lxml.html
>>> tree = lxml.html.fromstring(s)
>>> lxml.etree.tostring(tree)
'<div> </div>'
有沒有人知道這方面的解決方法?lxml截斷包含'小於'字符的文本
您的HTML輸入已損壞;代替<
左角支架應編碼爲<
。從lxml
documentation解析破解的HTML:
解析破碎HTML的支持完全取決於libxml2的恢復算法。如果您發現文件如此嚴重以致解析器無法處理它們,那麼它不是lxml的錯。也不能保證生成的樹會包含原始文檔中的所有數據。解析器在努力保持解析時可能必須嚴重損壞部分。特別錯位的meta標籤可能會受此影響,這可能會導致編碼問題。
換句話說,你採取什麼樣的,你可以從這些文件獲取的方式lxml
處理破碎HTML不是其他方式配置。
有一點你可能試一下是用不同的HTML解析器。嘗試使用BeautifulSoup,而不是HTML處理,它可能會爲您提供該文檔的不同版本,它可以提供您想要的內容。 BeautifulSoup可以重複使用不同的解析器後端,包括lxml
和html5lib
,所以它會給你更多的靈活性。
的html5lib
解析器確實給你<
字符(轉換爲<
逃生):
>>> BeautifulSoup("<div> < 20 </div>", "html5lib")
<html><head></head><body><div> < 20 </div></body></html>
呃,一段時間沒有做過很多html的東西,在'<':)的末尾忘了那個分號:) – Volatility
你的答案很好。你對使用BS和html5lib的建議解決了這個問題。謝謝。對於那些倒下 - 我認爲他們不瞭解這個問題。 – Viacheslav
由於您已經在使用'lxml',所以值得指出的是它有一個[html5parser](http://lxml.de/html5parser.html),它遵循w3c推薦的解析方法(理論上這是您的瀏覽器使用的)。 – mlissner
您的<
實際上應該是<
,因爲<
就像是html中的'保留字符'。那麼它應該工作。
謝謝,但我需要它與'<' – Viacheslav
明確工作你想要的是沒有任何特別的興趣在這裏。您的標記格式不正確。沒有XML解析器必須猜測修復垃圾標記。所以修正你的標記*第一* –
你的負面語氣是無關緊要的。我在抓取第三部分的html頁面,需要解析它。我給出的例子只是爲了證明這個問題。 – Viacheslav
這是損壞的HTML,但它是一個遺憾,LXML能不能適當地處理它。這種類型的html在野外非常普遍。 – speedplane