2010-08-12 5 views
0

je le document XML suivant:comportement bizarre avec lxml getIterator()

<x> 
    <a>Some text</c> 
    <b>Some text 2</b> 
    <c>Some text 3</c> 
</x> 

Je veux obtenir le texte de toutes les balises, alors j'ai décidé d'utiliser getiterator().

Mon problème est, il ajoute des lignes vides pour une raison que je ne peux pas comprendre. Considérez ceci:

>>> for text in document_root.getiterator(): 
...  print text.text 
... 


Some text 
Some text 2 
Some text 3 

Remarquez les deux lignes blanches supplémentaires avant "Une partie du texte. Quelle est la raison pour ça? Si je passe une balise à la méthode getiterator(), il n'y a pas de lignes vides, comme il se doit.

>>> for text in document_root.getiterator('a'): 
...  print text.text 
... 
Some text 

Donc ma question est, ce qui est à l'origine de ces lignes vides supplémentaires au cas où je passe getiterator() sans étiquette et comment puis-je les supprimer?

+0

J'ai aussi essayé de faire: 'si text.text == '\ n': continue' pour qu'il saute les lignes vides, mais ce n'est pas le cas. – user225312

Répondre

2

Par défaut lxml.etree considéreront texte vide entre les balises comme le contenu textuel pour cette balise et dans votre cas les espaces blancs affiché provient de <x>. Si vous voulez un analyseur qui ignore les espaces blancs que vous aurez envie de faire quelque chose comme:

from lxml import etree 

parser = etree.XMLParser(remove_blank_text=True) 

tree = etree.XML("""\ 
    <x> 
     <a>Some text</a> 
     <b>Some text 2</b> 
     <c>Some text 3</c> 
    </x> 
""", parser) 

for node in tree.iter(): 
    if node.text == None: continue 
    print node.text 

Notez comment node.text retourne None s'il n'y a pas de texte du tout. Notez également que the API documentation for lxml indique que getiterator() est déprécié en faveur de iter().

Pour plus d'informations, voir The lxml.etree Tutorial: Parser objects.

+0

Aah merci. Cela répond parfaitement à ma question. – user225312

+0

Heureux d'être de service ;-) –

+0

petite remarque: 'None' est unique, donc vous pouvez (et, à mon avis, devrait) utiliser' si node.text is None' directement. Mes deux centimes! –

0

Bien que je ne sois pas sûr, je suppose qu'il essaye de lire le texte dans < x>.

Quoi qu'il en soit, ce qui ne va pas avec

for text in document_root.getiterator(): 
    if text.strip() == '': continue 
    print text 
+0

Aah. J'ai oublié que je pourrais utiliser 'strip()' aussi. – user225312

+0

Il résout mon problème mais la question de savoir pourquoi cela arrive reste. – user225312

+0

Étant donné que l'élément contient du texte, dans ce cas, il s'agit simplement d'un espace, mais c'est toujours du texte. –