Python - HTML解析与整洁

时间:2010-10-15 09:35:24

标签: python html-parsing tidy

这段代码需要一些不好的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

我应该做些什么?谢谢!

2 个答案:

答案 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模块要快得多。