web-dev-qa-db-fra.com

Comment obtenir tous les sous-éléments d'une arborescence d'éléments avec Python ElementTree?

Je souhaite trouver un moyen d’obtenir tous les sous-éléments d’une arborescence d’éléments comme le fait ElementTree.getchildren(), puisque getchildren() est obsolète depuis Python version 2.7, je ne veux plus l’utiliser, même si je peux toujours l’utiliser actuellement.

Merci.

11
j5shi

Tous les sous-éléments (descendants) de elem:

all_descendants = list(elem.iter())

Un exemple plus complet:

>>> import xml.etree.ElementTree as ET
>>> a = ET.Element('a')
>>> b = ET.SubElement(a, 'b')
>>> c = ET.SubElement(a, 'c')
>>> d = ET.SubElement(a, 'd')
>>> e = ET.SubElement(b, 'e')
>>> f = ET.SubElement(d, 'f')
>>> g = ET.SubElement(d, 'g')
>>> [elem.tag for elem in a.iter()]
['a', 'b', 'e', 'c', 'd', 'f', 'g']

Pour exclure la racine elle-même:

>>> [elem.tag for elem in a.iter() if elem is not a]
['b', 'e', 'c', 'd', 'f', 'g']
13
Eli Bendersky

Si vous voulez obtenir tous les éléments 'a', vous pouvez utiliser:

a_lst = list(elem.iter('a'))

Si la elem est aussi 'a', elle sera incluse.

3
pepr

Aucune des réponses existantes ne trouvera tous les enfants. Cette solution utilise BeautifulSoup au lieu de ETree, mais trouvera tous les enfants au lieu du niveau supérieur uniquement:

from bs4 import BeautifulSoup    

with open(filename) as f:
    soup = BeautifulSoup(f, 'xml')

results = soup.find_all('element_name')
2
Turtles Are Cute

Peut-être que cela ne correspond pas à la question réelle de l'OP, mais dans un sens plus large, je suggérerais que, si quelqu'un souhaite que tous les éléments soient nommés, par exemple, 'objet' peut utiliser (une approche alternative à @Turtles Are Cute qui me semble au moins plus naturelle):

objs = tree.findall('object')

qui renvoie également une liste.

0
Eypros