2009-11-20 9 views
2

J'ai une application où j'utilise html5lib pour analyser libéralement html. J'utilise l'interface minidom, car j'ai besoin d'une API DOM réelle et ElementTree n'est pas approprié pour ce que je fais.Existe-t-il un moyen d'analyser html avec lxml, mais de le manipuler avec minidom?

Voilà comment je fais ceci:

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

Cependant, l'analyse des fichiers énormes devient un goulot d'étranglement, et l'analyse syntaxique lxml est d'environ 80 fois plus rapide que html5lib (je benchmarkée il).

Comment est-ce que j'analyse avec lxml ou une bibliothèque tolérant le mauvais-html rapidement semblable, et manipule avec une API compatible de DOM?

+0

Comment ElementTree n'est-il pas adapté à ce que vous faites? Mon expérience est que l'API de lxml est meilleure que celle de minidom dans tous les sens. – Allen

+0

J'ai besoin de manipuler manuellement les nœuds de texte, avec un contrôle total sur leur division et leur normalisation. L'API ElementTree n'a pas cette capacité. –

Répondre

4

pense avoir trouvé une solution:

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 

Cependant, ceci est seulement environ 7 fois plus rapide que html5lib. L'appel de saxification prend beaucoup de temps.

+0

vous vouliez dire plus lent? – Alex