[pyar] Parsear grandes XMLs con etree

Sebastian Bassi sebastian.bassi en globant.com
Mar Abr 18 19:51:51 ART 2017


Estaria bueno que puedas hacer un codigo y xml minimo que reproduzca el
problema. No te pido el XML original porque decis que es muy grande y
supongo que puede tener info confidencial. Pero estaría bueno que usandolo
de modelo hagas una versión minima donde ocurra el problema asi puedo
tratar de ayudarte. Y subilos a pastebin o github porque al poner el código
aca a veces salen mal los espacios (por ej en tú código no veo los except
al mismo nivel del try que es donde deberian estar).
Saludos,
SB

2017-04-12 14:07 GMT-07:00 Cristhian Boujon <cristhianboujon en gmail.com>:

> 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!
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>



-- 
Sebastián Bassi. sebastian.bassi en globant.com
Lic. en Biotecnología con orientación en genética molecular.

-- 


The information contained in this e-mail may be confidential. It has been 
sent for the sole use of the intended recipient(s). If the reader of this 
message is not an intended recipient, you are hereby notified that any 
unauthorized review, use, disclosure, dissemination, distribution or 
copying of this communication, or any of its contents, 
is strictly prohibited. If you have received it by mistake please let us 
know by e-mail immediately and delete it from your system. Many thanks.

 

La información contenida en este mensaje puede ser confidencial. Ha sido 
enviada para el uso exclusivo del destinatario(s) previsto. Si el lector de 
este mensaje no fuera el destinatario previsto, por el presente queda Ud. 
notificado que cualquier lectura, uso, publicación, diseminación, 
distribución o copiado de esta comunicación o su contenido está 
estrictamente prohibido. En caso de que Ud. hubiera recibido este mensaje 
por error le agradeceremos notificarnos por e-mail inmediatamente y 
eliminarlo de su sistema. Muchas gracias.

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20170418/38917c34/attachment.html>


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