[pyar] Parsear grandes XMLs con etree

Cristhian Boujon cristhianboujon en gmail.com
Mie Abr 12 18:07:09 ART 2017


Hola a todos,

¿Cómo están?
Estoy trabajando con con XML bastante grandes, por lo que estoy usando
ElementTree.iterparse().

Actualmente me encuentro con un problema y es que el XML parece no estar
bien generado para un nodo específico. La idea es poder seguir procesando
el archivo independientemente de los nodos corruptos que hayan. El código
desarrollado (Simplificado) es el siguiente:

xml_parser = etree.iterparse(file)

while True:
    try:
        event, element = next(xml_parser)

        if element.tag == "tag1":
            # Doing some stuff
        # If there is no more elements to iterate, breaks the loop
        except StopIteration:
            break

        # While another exception, keep looping
        except Exception as e:
            pass

Haciendo la una prueba obtuve el siguiente output:

with open(file) as fp:
    for i, line in enumerate(fp):
        if i == 319850:
            print(319850, line)
        if i == 319851:
            print(319851, line)
        if i == 319852:
            print(319852, line)
        if i == 319853:
            print(319853, line)

            break

*output*:

319850    <tag1> <tag11><![CDATA[ foo bar

319851    ]]></tag11></tag1>

319852    <tag1> <tag11><![CDATA[ foo bar]]></tag11><tag1>

319853    <tag1> <tag11><![CDATA[ foo bar]]></tag11><tag1>

Lo que quiere decir que la línea está cortada, de alguna manera y por eso
la libería xml.etree genera una excepción.
Como decía al principio, debería poder continuar procesando los siguientes
nodos, sin embargo, cuando se genera la excepción de formato inválido, el
script queda en un loop infinito. Por lo que estuve leyendo, ésto se debe a
que next() no devuelve el siguiente elemento si ocurre una excepción, así
que eso es un problema para éste caso.
Tienen alguna recomendación y/o qué camino debería seguir?

Saludos!
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20170412/7098e68e/attachment-0001.html>


Más información sobre la lista de distribución pyar