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:
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> lxml.etree.xmlsyntaxError: nom d'attribut redéfini, ligne 134, colonne 59 code> 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'
5 Réponses :
essayez d'analyser votre document HTML avec lxml.html : p>
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. P> blockQuote>
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.
Utiliser true code> pour iterparse ' S arguments
html code> et
énorme_tree code>. p>
J'utilise actuellement html = true code>, il soulève toujours des erreurs de syntaxe XML. Je vais jeter un coup d'œil au paramètre
énorme_tree code>.
énorme_tree code> 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.
La solution parfaite a fini par être le très propre de Python htmlParser code> [docs] em> sup>
.
Ceci est le code (assez mauvais) que j'ai fini par utiliser: p> Avec ce code, je pourrais alors faire cela: p>
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: p>
C'est la meilleure réponse pour moi.
Désolé d'avoir rééchangé une ancienne question, mais pour les retards de recherche de solutions, LXML 3.3 a 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