2010-10-15 4 views
1

Этот код занимает немного плохого html, использует библиотеку Tidy для его очистки, а затем передает его в HtmlLib.Reader().Python - HTML-анализ с Tidy

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 

Что я должен делать по-другому? Благодаря!

+1

Какой 'tidy' модуль вы импорта? PyPI показывает как минимум два, и я не уверен, что один из них, включенный в дистрибутив 'tidy' (для« tidy ») ubuntu, является одним из них. – intuited

ответ

4

tidy's 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

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

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

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