2010-10-15 108 views
1

該代碼需要一些不良的html,使用Tidy庫進行清理,然後將其傳遞給HtmlLib.Reader()。Python - 整理HTML解析

import tidy 
options = dict(output_xhtml=1, 
       add_xml_decl=1, 
       indent=1, 
       tidy_mark=0) 

from xml.dom.ext.reader import HtmlLib 
reader = HtmlLib.Reader() 

doc = reader.fromString(tidy.parseString("<Html>Bad Html.", **options)) 

我不是通過用正確的類型,似乎fromString,這種回溯:

Traceback (most recent call last): 
    File "getComicEmbed.py", line 33, in <module> 
    doc = reader.fromString(tidy.parseString("<Html>Bad Html.</b>", **options)) 
    File "C:\Python26\lib\site-packages\_xmlplus\dom\ext\reader\HtmlLib.py", line 67, in fromString 
stream = reader.StrStream(str) 
    File "C:\Python26\lib\site-packages\_xmlplus\dom\ext\reader\__init__.py", line 24, in StrStream 
return cStringIO.StringIO(st) 
TypeError: expected read buffer, _Document found 

我應該怎麼做不同?謝謝!

+1

tidy'模塊在導入哪個'? PyPI顯示至少兩個,我不確定是否包含在'tidy'源代碼分發包中的那個(對於ubuntu的'tidy'包)是其中之一。 – intuited 2010-10-15 09:55:55

回答

4

tidy的parseString函數返回一個_Document實例,該實例實現了__str__而不是緩衝區接口。因此HtmlLib.Reader().fromString無法創建一個StringIO對象。

這應該是相當簡單的,變化:

doc = reader.fromString(tidy.parseString("<Html>Bad Html.", **options)) 

doc = reader.fromString(str(tidy.parseString("<Html>Bad Html.", **options))) 
1

我還沒有使用Python tidy模塊,我不確定如何找到它,但它看起來像你需要調用tidy.fromString的結果toString來將你的解析文檔轉換回XHTML。

對於不同的方法,您可以考慮使用lxml.html,這在解析損壞的標記時體面,併爲您提供了一個用於處理結果的優秀ElementTree API。它也可以漂亮地打印* ML,這使得它成爲一個整潔的超集,儘管可能不具備導航不連貫標記的相同能力。另外:lxml是用C編寫的(實際上,就像python的tidy模塊一樣,只是包裝了一個C庫),所以它比用於處理XML的其他一些python模塊要快得多。