Python - Разбор HTML с Tidy - PullRequest
       19

Python - Разбор HTML с Tidy

1 голос
/ 15 октября 2010

Этот код принимает немного плохого 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 ]

4 голосов
/ 15 октября 2010
Функция

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 голос
/ 15 октября 2010

Я не использовал модуль Python tidy и не уверен, как его найти, но похоже, что вам нужно вызвать что-то вроде toString в результате tidy.fromString, чтобы преобразовать проанализированный документ обратнов XHTML.

Для другого подхода вы можете рассмотреть возможность использования lxml.html, который подходит для анализа разбитой разметки и предоставляет отличный API-интерфейс ElementTree для работы с результатом.Он также может красиво печатать * ML, что делает его своего рода надстройкой аккуратности, хотя, возможно, не с той же способностью перемещаться по непоследовательной разметке.

Также: lxml написан на C (фактически, какмодуль (и) python tidy, просто оборачивает библиотеку C), поэтому он намного быстрее, чем некоторые другие модули python для работы с XML.

...