2010-11-17 23 views
1

J'ai quelques fichiers sgml qui sont normalisés à peu près. Cependant, il peut y avoir des données contenues dans un tag que je ne connais pas avant d'ouvrir le fichier et de le lire personnellement. Par exemple, les fichiers ont des adresses et généralement les adresses ont une rue, une ville, un état, un zip et un téléphone. Chaque élément de l'adresse est indiquée par une baliseUtilisation de lxml pour extraire des données où tous les éléments ne sont pas connus à l'avance

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

Mais, par exemple, je l'ai découvert qu'il ya des balises pour Country, STREET1, STREET2. J'ai plus de 200K fichiers à traiter et je veux savoir s'il est possible de retirer tous les éléments des adresses sans avoir à se soucier de connaître l'existence de balises inconnues.

Ce que je l'ai fait jusqu'à présent est

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

mais ce que je reçois est problématique parce que je ne peux pas identifier où un élément se termine et la suivante commence

One Main StreetGotham City99999-123-5467 
+0

Donc, vous voulez obtenir toutes les balises présentes dans le fichier? – user225312

+0

Eh bien oui et non. Tout d'abord obtenir tous les tags dans un fichier serait bien, mais je voudrais aussi obtenir tous les tags dans la section ADRESSE du fichier – PyNEwbie

+0

Je suis confus - votre entrée est SGML, mais vous avez accepté une réponse qui implique l'analyse XML - ont vous avez trouvé un moyen de convertir votre SGML en XML en premier? Si oui, je pourrais utiliser votre technique! :) –

Répondre

2

Pour obtenir toutes les balises , nous iter à travers le document comme celui-ci:

Supposons que votre structure XML est comme ceci:

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

Nous parser:

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

Supposons maintenant que votre XML possède des balises supplémentaires ainsi; les balises dont vous n'êtes pas conscient. Puisque nous parcourons le code XML, le code ci-dessus renverra également ces balises.

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

Le code ci-dessus retourne:

ADDRESS 
STREET 
STREET1 
CITY 
ZIP 
PHONE 
COUNTRY 

Maintenant, si nous voulons obtenir le texte des balises, la procédure est la même. Il suffit d'imprimer tag.text comme ceci:

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

One Main Street 
One Second Street 
Gotham City 
99999
555-123-5467 
USA 
+0

Merci, je l'apprécie. Cela aide beaucoup – PyNEwbie