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.

Другие вопросы по тегам