Pregunta

Tengo algunos archivos sgml que están más o menos estandarizados.Sin embargo, puede haber datos contenidos dentro de una etiqueta que no sé que existen antes de abrir el archivo y leerlo personalmente.Por ejemplo, los archivos tienen direcciones y generalmente las direcciones tienen una calle, una ciudad, un estado, un zip y un teléfono.Cada elemento de la dirección se indica con una etiqueta.

 <ADDRESS>
 <STREET>One Main Street
 <CITY>Gotham City
 <ZIP>99999 0123
 <PHONE>555-123-5467
 </ADDRESS>

Pero, por ejemplo, he descubierto que hay etiquetas para País, CALLE1, CALLE2.Tengo más de 200.000 archivos para procesar y quiero saber si es posible extraer todos los elementos de las direcciones sin tener que preocuparme por saber la existencia de etiquetas desconocidas.

Lo que he hecho hasta ahora es

h=fromstring(my_data_in_a_string)
for each in h.cssselect('mail_address'):
    each.text_content()

pero lo que obtengo es problemático porque no puedo identificar dónde termina un elemento y comienza el siguiente

One Main StreetGotham City99999 0123555-123-5467
¿Fue útil?

Solución

Para obtener todas las etiquetas, que iter a través del documento de la siguiente manera:

Suponga que su estructura XML es la siguiente:

<ADDRESS>
 <STREET>One Main Street</STREET>
 <CITY>Gotham City</CITY>
 <ZIP>99999 0123</ZIP>
 <PHONE>555-123-5467</PHONE>
 </ADDRESS>

analizarlo:

>>> from lxml import etree
>>> f = etree.parse('foo.xml')  # path to XML file
>>> root = f.getroot() # get the root element
>>> for tags in root.iter(): # iter through the root element
...     print tags.tag       # print all the tags
... 
ADDRESS
STREET
CITY
ZIP
PHONE

Ahora supongamos que el XML tiene etiquetas adicionales así; etiquetas que no son conscientes de. Puesto que estamos iterando a través del XML, el código anterior devolverá dichas etiquetas.

<ADDRESS>
         <STREET>One Main Street</STREET>
         <STREET1>One Second Street</STREET1>
        <CITY>Gotham City</CITY>
         <ZIP>99999 0123</ZIP>
         <PHONE>555-123-5467</PHONE>         
         <COUNTRY>USA</COUNTRY>    
</ADDRESS>

Los rendimientos código anterior:

ADDRESS
STREET
STREET1
CITY
ZIP
PHONE
COUNTRY

Ahora bien, si queremos obtener el texto de las etiquetas, el procedimiento es el mismo. Sólo imprimir tag.text como esto:

>>> for tags in root.iter():
...     print tags.text
... 

One Main Street
One Second Street
Gotham City
99999 0123
555-123-5467
USA
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top