这段代码需要一些不好的html,使用Tidy库来清理它,然后将它传递给HtmlLib.Reader()。
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
我应该做些什么?谢谢!
答案 0 :(得分: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 :(得分:1)
我没有使用过Python tidy
模块,也不确定如何找到它,但看起来你需要在toString
的结果上调用tidy.fromString
之类的内容将解析后的文档转换回XHTML。
对于不同的方法,您可以考虑使用lxml.html
,它在解析损坏的标记方面很不错,并为您提供了一个很好的ElementTree API来处理结果。它也可以漂亮地打印* ML,这使它成为整洁的超集,但可能没有完全相同的导航不连贯标记的能力。
另外:lxml是用C语言编写的(实际上,就像python tidy
模块一样,只是包装了一个C库)所以它比其他一些用于处理XML的python模块要快得多。