2010-04-27 7 views
35
<?xml version="1.0" ?> 
<data> 
    <test > 
     <f1 /> 
    </test > 
    <test2 > 
     <test3> 
     <f1 /> 
     </test3> 
    </test2> 
    <f1 /> 
</data> 

En utilisant lxml est-il possible de trouver récursivement pour l'étiquette "f1"? J'ai essayé la méthode findall mais cela ne fonctionne que pour les enfants immédiats.Comment trouver récursivement une balise XML en utilisant LXML?

Je pense que je devrais aller pour BeautifulSoup pour cela !!!

Répondre

56

Vous pouvez utiliser XPath pour rechercher récursive:

>>> from lxml import etree 
>>> q = etree.fromstring('<xml><hello>a</hello><x><hello>b</hello></x></xml>') 
>>> q.findall('hello')  # Tag name, first level only. 
[<Element hello at 414a7c8>] 
>>> q.findall('.//hello') # XPath, recursive. 
[<Element hello at 414a7c8>, <Element hello at 414a818>] 
22

iterfind() itère sur tous les éléments qui correspondent à l'expression de chemin

findall() renvoie une liste de correspondance des éléments

find() retourne efficacement que le premier correspondance

findtext() ret Urnes le contenu .text du premier match

Exemples:

>>> root = etree.XML("<root><a x='123'>aText<b/><c/><b/></a></root>") 
#Find a child of an Element: 
>>> print(root.find("b")) 
None 
>>> print(root.find("a").tag) 
a 
#Find an Element anywhere in the tree: 
>>> print(root.find(".//b").tag) 
b 
>>> [ b.tag for b in root.iterfind(".//b") ] 
['b', 'b'] 
#Find Elements with a certain attribute: 
>>> print(root.findall(".//a[@x]")[0].tag) 
a 
>>> print(root.findall(".//a[@y]")) 
[] 

Référence: http://lxml.de/tutorial.html#elementpath

(Cette réponse est la sélection sélective pertinente du contenu à ce lien)

Questions connexes