Вопрос по python, elementtree, xml – Как получить все вложенные элементы дерева элементов с помощью Python ElementTree?

11

Я хочу найти способ получить все подэлементы дерева элементов, как способElementTree.getchildren() делает, так какgetchildren() устарела с Python версии 2.7, я больше не хочу его использовать, хотя все еще могу использовать его в настоящее время.

Благодарю.

Ваш Ответ

5   ответов
2

льзует BeautifulSoup вместо ETree, но найдет всех дочерних элементов, а не только верхнего уровня:

from bs4 import BeautifulSoup    

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

results = soup.find_all('element_name')
3

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

Еслиelem также 'a', он будет включен.

13

Все подэлементы (потомки)elem:

all_descendants = list(elem.iter())

Более полный пример:

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

Чтобы исключить сам корень:

>>> [elem.tag for elem in a.iter() if elem is not a]
['b', 'e', 'c', 'd', 'f', 'g']
@Steven: смотрите обновление
Объекты элемента итеративны и без использованияiter(), Элемент ведет себя также как список; Таким образом, вы также можете индексировать подэлементы.
Извините, Элай, но, может быть, я не понял себя, я просто хочу получить все подэлементы, а не рут. то есть корень здесь нежелателен. но я думаю, что ваш метод также содержит корневой объект, верно? j5shi
@pepr: да, но это только дает вам непосредственные потомки элемента, а не всех потомков
Но что, если есть несколько строк с тэгом 'a'; вложенный в элемент 'a'; и я хочу получить все подэлементы всех 'a'; Структуры? j5shi
0

это не соответствует действительному вопросу OP, но в более широком смысле я хотел бы предложить, чтобы, если кто-то хочет получить имена всех элементов с определенным именем, например & APOS; объект & APOS; Можно использовать (альтернативный подход к @Turtles Are Cute, который, по крайней мере, мне кажется более естественным):

objs = tree.findall('object')

который также возвращает список.

0

ия дочерних элементов.
list(elem)

@ GoranKutlaca: проверьте мой ответ. он утверждает, что использовать list (elem) не использовать list (elem.iter ()). Есть разница в обоих звонках. list (elem) будет содержать только подэлементы.
list() уже предлагалось в предыдущих ответах, а также в ответе, помеченном как правильный. Там не было никакой необходимости в этом ответе.

Похожие вопросы