Из документации ElementTree :
Element.findall()
находит только элементы с тегом, которые являются прямыми потомками текущего элемента.
Вы ищете вложенный элемент, поэтому findall()
не может найти его из корня. То есть, если вы не используете выражение XPath .
Выражение .//bndbox
найдет элемент в любом месте дерева. Возможно, вы захотите найти и обработать дочерние элементы, вы можете взять их имя после нахождения all . .//bbndbox/*
найдет все дочерние элементы:
>>> root.findall('.//bndbox')
[<Element 'bndbox' at 0x10c1775e8>]
>>> root.findall('.//bndbox/*')
[<Element 'xmin' at 0x10c177638>, <Element 'ymin' at 0x10c177688>, <Element 'xmax' at 0x10c1776d8>, <Element 'ymax' at 0x10c177728>]
Используйте это для создания словаря (с пониманием словаря); Вы можете даже преобразовать содержащийся текст в целые числа в этой точке:
box = {e.tag: int(e.text) for e in root.findall('.//bndbox/*')}
Демо-версия:
>>> box = {e.tag: int(e.text) for e in root.findall('.//bndbox/*')}
>>> box
{'xmin': 316, 'ymin': 301, 'xmax': 1179, 'ymax': 1964}
>>> box['xmin']
316