2010-10-15 163 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模块要快得多。