Python - Разбор HTML с 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:
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 ответа
Опрятные -х 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)))
Я не пользовался питоном tidy
модуль, и я не уверен, как его найти, но похоже, что вам нужно вызвать что-то вроде toString
на результат tidy.fromString
преобразовать ваш разобранный документ обратно в XHTML.
Для другого подхода вы могли бы рассмотреть возможность использования lxml.html
, который неплохо разбирает разбитую разметку и предоставляет вам отличный ElementTree API для работы с результатом. Он также может красиво печатать *ML, что делает его своего рода надстройкой аккуратности, хотя, возможно, и не с той же способностью перемещаться по несвязной разметке.
Также: lxml написан на C (на самом деле, как и Python tidy
модуль (модули), просто оборачивает библиотеку C), поэтому он работает намного быстрее, чем некоторые другие модули Python для работы с XML.