6
votes

Superativement analyser html (avec lxml?)

Je tente actuellement d'analyser itérablement un très grand document HTML (je sais .. yuck) pour réduire la quantité de mémoire utilisée. Le problème que je vais avoir, c'est que je reçois des erreurs de syntaxe XML telles que:

lxml.etree.xmlsyntaxError: nom d'attribut redéfini, ligne 134, colonne 59 code> p>

Cela provoque alors tout ce qui est à cesser. P>

existe un moyen d'analyser itérative HTML sans étouffer les erreurs de syntaxe? P>

Au moment où j'explète le numéro de ligne de l'erreur de syntaxe XML Exception, supprimant cette ligne du document, puis redémarrer le processus. On dirait une solution assez dégoûtante. Existe-t-il une meilleure façon? P>

EDIT: strong> p>

C'est ce que je fais actuellement: p>

context = etree.iterparse(tfile, events=('start', 'end'), html=True)
in_table = False
header_row = True
while context:
    try:
        event, el = context.next()

        # do something

        # remove old elements
        while el.getprevious() is not None:
            del el.getparent()[0]

    except etree.XMLSyntaxError, e:
        print e.msg
        lineno = int(re.search(r'line (\d+),', e.msg).group(1))
        remove_line(tfilename, lineno)
        tfile = open(tfilename)
        context = etree.iterparse(tfile, events=('start', 'end'), html=True)
    except KeyError:
        print 'oops keyerror'


0 commentaires

5 Réponses :


-1
votes

essayez d'analyser votre document HTML avec lxml.html :

Depuis la version 2.0, LXML est livré avec un package Python dédié pour traiter HTML: lxml.html. Il est basé sur l'analyseur HTML de LXML, mais fournit une API d'élément spécial pour des éléments HTML, ainsi qu'un certain nombre d'utilitaires pour les tâches de traitement HTML communes.


2 commentaires

J'essaie d'analyser itérablement le document en raison de sa grande taille. lxml.html n'a pas de fonction iterparse aussi loin que je peux dire.


J'ai suggéré lxml.html parce que dans l'opération, il n'y avait aucune mention d'essayer lxml.html. Je pense que la baisse de votre réponse est plutôt égarée.



1
votes

Utiliser true pour iterparse ' S arguments html et énorme_tree .


2 commentaires

J'utilise actuellement html = true , il soulève toujours des erreurs de syntaxe XML. Je vais jeter un coup d'œil au paramètre énorme_tree .


énorme_tree ne semble pas pertinent: "énorme_tree: désactiver les restrictions de sécurité et soutenir des arbres très profonds". Mon arbre n'est pas profond, juste longtemps.



8
votes

La solution parfaite a fini par être le très propre de Python htmlParser [docs] .

Ceci est le code (assez mauvais) que j'ai fini par utiliser: xxx

Avec ce code, je pourrais alors faire cela: xxx


0 commentaires

5
votes

Au moment où lxml etree.iterparse Prise en charge de l'argument de mots clés Récupération = true , de sorte que, à la place de la sous-classe personnalisée de HTMLParser fixant HTML cassé, vous pouvez simplement transmettre cet argument à iterparse.

Pour bien analyser HTML énorme et brisé, vous n'avez besoin que de suivre: xxx


1 commentaires

C'est la meilleure réponse pour moi.



0
votes

Désolé d'avoir rééchangé une ancienne question, mais pour les retards de recherche de solutions, LXML 3.3 a HTMLPullParser et XMLPullParser qui analyse progressive. On peut également consulter Introduction LXMLL pour analyser pour plus d'exemples.

Au cas où l'OP dit Il est nécessaire d'analyser un très gros document et une économie de mémoire est souhaitée, il est possible de Écrivez une classe personnalisée comme gestionnaire d'événement pour éviter de construire l'arbre d'élément. Quelque chose comme: xxx


0 commentaires