2009-11-20 2 views
2

У меня есть приложение, в котором я использовал html5lib для свободного анализа html. Я использую интерфейс мини-интерфейса, потому что мне нужен настоящий API DOM, а ElementTree не подходит для того, что я делаю.Есть ли способ разобрать html с lxml, но манипулировать им с помощью мини-диска?

Вот как я это делаю:

parser = html5lib.XHTMLParser(tree=html5lib.treebuilders.getTreeBuilder('dom')) 
parser.parse(html) 

Однако разбор больших файлов становится узким местом производительности, и LXML разборе около 80 раз быстрее, чем html5lib (я протестированные его).

Как анализировать с помощью lxml или аналогично быстрой библиотеки с плохой html-терпимостью и манипулировать с DOM-совместимым API?

+0

Как ElementTree не подходит для того, что вы делаете? Мой опыт в том, что API lxml лучше, чем мини-юниты. – Allen

+0

Мне нужно вручную манипулировать текстовыми узлами, с полным контролем над их расщеплением и нормализацией. API ElementTree не обладает этой возможностью. –

ответ

4

Кажется, я нашел решение:

from xml.dom.pulldom import SAX2DOM 
import lxml.sax 
def parse_lxml_dom(html): 
    tree = lxml.html.document_fromstring(html) 
    handler = SAX2DOM() 
    lxml.sax.saxify(tree, handler) 
    return handler.document 

Однако, это всего лишь около 7 раз быстрее, чем html5lib. Вызов saxify занимает довольно много времени.

+0

Вы имели в виду медленнее? – Alex

Смежные вопросы