2013-01-05 27 views
5
>>> s = '<div> < 20 </div>' 
>>> import lxml.html 
>>> tree = lxml.html.fromstring(s) 
>>> lxml.etree.tostring(tree) 
'<div> </div>' 

有沒有人知道這方面的解決方法?lxml截斷包含'小於'字符的文本

+1

這是損壞的HTML,但它是一個遺憾,LXML能不能適當地處理它。這種類型的html在野外非常普遍。 – speedplane

回答

13

您的HTML輸入已損壞;代替<左角支架應編碼爲&lt;。從lxml documentation解析破解的HTML:

解析破碎HTML的支持完全取決於libxml2的恢復算法。如果您發現文件如此嚴重以致解析器無法處理它們,那麼它不是lxml的錯。也不能保證生成的樹會包含原始文檔中的所有數據。解析器在努力保持解析時可能必須嚴重損壞部分。特別錯位的meta標籤可能會受此影響,這可能會導致編碼問題。

換句話說,你採取什麼樣的,你可以從這些文件獲取的方式lxml處理破碎HTML不是其他方式配置。

有一點你可能試一下是用不同的HTML解析器。嘗試使用BeautifulSoup,而不是HTML處理,它可能會爲您提供該文檔的不同版本,它可以提供您想要的內容。 BeautifulSoup可以重複使用不同的解析器後端,包括lxmlhtml5lib,所以它會給你更多的靈活性。

html5lib解析器確實給你<字符(轉換爲&lt;逃生):

>>> BeautifulSoup("<div> < 20 </div>", "html5lib") 
<html><head></head><body><div> &lt; 20 </div></body></html> 
+0

呃,一段時間沒有做過很多html的東西,在'<':)的末尾忘了那個分號:) – Volatility

+3

你的答案很好。你對使用BS和html5lib的建議解決了這個問題。謝謝。對於那些倒下 - 我認爲他們不瞭解這個問題。 – Viacheslav

+1

由於您已經在使用'lxml',所以值得指出的是它有一個[html5parser](http://lxml.de/html5parser.html),它遵循w3c推薦的解析方法(理論上這是您的瀏覽器使用的)。 – mlissner

2

您的<實際上應該是&lt;,因爲<就像是html中的'保留字符'。那麼它應該工作。

+0

謝謝,但我需要它與'<' – Viacheslav

+0

明確工作你想要的是沒有任何特別的興趣在這裏。您的標記格式不正確。沒有XML解析器必須猜測修復垃圾標記。所以修正你的標記*第一* –

+8

你的負面語氣是無關緊要的。我在抓取第三部分的html頁面,需要解析它。我給出的例子只是爲了證明這個問題。 – Viacheslav