Análisis de archivos XML grandes con Python lxml e Iterparse

Estoy intentando escribir un analizador usando lxml y el método iterparse para recorrer un archivo xml muy grande que contiene muchos elementos.

Mi archivo es del formato:

 Item 1 Description 1  http://www.url1.com    Item 2 Description 2  http://www.url2.com   

y hasta ahora mi solución es:

 from lxml import etree context = etree.iterparse( MYFILE, tag='item' ) for event, elem in context : print elem.xpath( 'description/text( )' ) elem.clear( ) while elem.getprevious( ) is not None : del elem.getparent( )[0] del context 

Cuando lo ejecuto, obtengo algo similar a:

 [] ['description1'] [] ['description2'] 

Los conjuntos en blanco se deben a que también extrae las tags de elementos que son secundarias a la etiqueta url, y obviamente no tienen un campo de descripción para extraer con xpath. Mi esperanza era analizar cada uno de los elementos 1 por 1 y luego procesar los campos secundarios según sea necesario. Me estoy limitando a aprender el libarary lxml, así que tengo curiosidad por saber si hay alguna forma de extraer los elementos principales y dejar solo los elementos secundarios si se encuentran.

Todo el XML se analiza de todos modos por la implementación del núcleo. El etree.iterparse es solo una vista en el estilo del generador, que proporciona un filtro simple por nombre de etiqueta (vea docstring http://lxml.de/api/lxml.etree.iterparse-class.html ). Si quieres un filtrado complejo debes hacerlo por tu cuenta.

Una solución: registrarse para el evento de inicio también:

 iterparse(self, source, events=("start", "end",), tag="item") 

y tenga un bool para saber cuándo está en el final del “elemento”, cuando está en el final del “elemento / url / elemento”.