1

このコードは、少し悪い 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

どうすればいいですか?ありがとう!

4

2 に答える 2

4

tidy の関数は、実装しているがバッファ インターフェイスを実装していないインスタンスをparseString返します。したがって、そこからオブジェクトを作成することはできません。_Document__str__HtmlLib.Reader().fromStringStringIO

これはかなり単純なはずです。次のように変更します。

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

doc = reader.fromString(str(tidy.parseString("<Html>Bad Html.", **options)))
于 2010-10-15T09:55:22.203 に答える
1

私は Python モジュールを使用しておらず、それを見つける方法もわかりませんが、解析されたドキュメントを XHTML に変換するために、結果のtidyようなものを呼び出す必要があるようです。toStringtidy.fromString

別のアプローチとして、 の使用を検討できますlxml.html。これは、壊れたマークアップの解析に優れており、結果を操作するための優れた ElementTree API を提供します。また、*ML をきれいに印刷することもできます。これにより、整理されたスーパーセットのようなものになりますが、一貫性のないマークアップをナビゲートする能力はおそらく同じではありません。

また、lxml は C で記述されているため (実際には、Pythontidyモジュールと同様に、C ライブラリをラップするだけです)、XML を操作するための他の Python モジュールよりもはるかに高速です。

于 2010-10-15T09:50:21.337 に答える