Frage

ich einige SGML-Dateien, die in etwa standardisiert sind. Allerdings kann es Daten in einem Tag enthalten sein, dass ich nicht weiß es vorhanden ist, bevor ich die Datei öffnen und persönlich lesen. Zum Beispiel haben die Dateien Adressen und haben in der Regel der Adressen eine Straße, eine Stadt, einen Staat, einen Reißverschluss und ein Telefon. Jedes Element der Adresse wird mit einem Tag angegeben

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

Aber zum Beispiel, habe ich entdeckt, dass es Tags für Land, STREET1, STREET2. Ich habe mehr als 200K Dateien zu verarbeiten, und ich möchte wissen, ob es möglich ist, alle Elemente der Adressen zu ziehen, ohne zu befürchten, die die Existenz von unbekannten Variablen zu kennen.

Was ich getan habe, so weit ist

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

aber was ich bekommen ist problematisch, weil ich nicht, wo ein Element Enden identifizieren können und die nächste beginnt

One Main StreetGotham City99999 0123555-123-5467
War es hilfreich?

Lösung

alle Tags erhalten, wir iter durch das Dokument wie folgt aus:

Angenommen, Ihre XML-Struktur ist wie folgt:

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

Wir können es analysieren:

>>> 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

Nehmen wir nun an Ihre XML als auch zusätzliche Tags hat; Tags Sie sind sich nicht bewusst über. Da wir durch die XML iterieren, wird der obige Code diese Tags als auch zurück.

<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>

Der obige Code gibt Folgendes zurück:

ADDRESS
STREET
STREET1
CITY
ZIP
PHONE
COUNTRY

Nun, wenn wir den Text der Tags, ist das Verfahren das gleiche erhalten möchten. drucken tag.text Genau wie folgt aus:

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

One Main Street
One Second Street
Gotham City
99999 0123
555-123-5467
USA
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top