Как извлечь атрибут xml с помощью Python ElementTree

Для:

<foo>
 <bar key="value">text</bar>
</foo>

Как получить «значение»?

xml.findtext("./bar[@key]")

Выдает ошибку.


person Will Curran    schedule 01.01.2011    source источник


Ответы (5)


Это найдет первый экземпляр элемента с именем bar и вернет значение атрибута key.

In [52]: import xml.etree.ElementTree as ET

In [53]: xml=ET.fromstring(contents)

In [54]: xml.find('./bar').attrib['key']
Out[54]: 'value'
person unutbu    schedule 01.01.2011
comment
@Stevoisiak, у меня похожая проблема <image height="940" id="0" name="C02032-390.jpg" width="1820"> <box label="Objects" occluded="1" xbr="255" xtl="0" ybr="624" ytl="509"> <attribute name="Class">Car</attribute> </box> </image> Я хотел бы получить доступ к машине из атрибута. - person Sanjay; 14.03.2020

Получение значения атрибута дочернего тега в XML с помощью ElementTree

Проанализируйте файл XML и получите тег root, а затем использование [0] даст нам первый дочерний тег. Точно так же [1], [2] дает нам последующие дочерние теги. После получения дочернего тега используйте .attrib[attribute_name], чтобы получить значение этого атрибута.

>>> import xml.etree.ElementTree as ET
>>> xmlstr = '<foo><bar key="value">text</bar></foo>'
>>> root = ET.fromstring(xmlstr)
>>> root.tag
'foo'
>>> root[0].tag
'bar'
>>> root[0].attrib['key']
'value'

Если содержимое xml находится в файле. Вы должны выполнить следующую задачу, чтобы получить файл root.

>>> tree = ET.parse('file.xml')
>>> root = tree.getroot()
person rashok    schedule 26.04.2018
comment
Я получаю сообщение об ошибке AttributeError: объект 'builtin_function_or_method' не имеет атрибута 'fromstring' - person Chang Zhao; 26.04.2019

Ваше выражение:

./бар[@key]

Это означает: bar детей с атрибутом key

Если вы хотите выбрать атрибут, используйте это относительное выражение:

bar/@key

Это означает: атрибут key bar дочерних элементов

Конечно, вам нужно подумать об использовании полностью совместимого механизма XPath, такого как lxml.

person Community    schedule 01.01.2011
comment
Не уверен, что это ElementTree или Google App Engine, но использование '@' вызывает SyntaxError (неподдерживаемый синтаксис пути (%s) % op) SyntaxError: неподдерживаемый синтаксис пути (@) - person Will Curran; 01.01.2011
comment
@Will Merydith: Пожалуйста, прочитайте мое последнее предложение. Базовый ElementTree API - это не полноценный движок XPath для жалоб... - person ; 01.01.2011
comment
OK. Я посмотрю, смогу ли я найти модуль, который будет работать на GAE/Py2.5.5. - person Will Curran; 01.01.2011
comment
Кажется, что python ElementTree не поддерживает такой синтаксис, как bar/@key, и вы должны использовать xxx.attribut.get("key") для соответствующего xxx. - person Don Smith; 17.11.2020

Следующим методом вы можете получить все атрибуты из xml (в словаре)

import xml.etree.ElementTree as etree
xmlString= "<feed xml:lang='en'><title>World Wide Web</title><subtitle lang='en'>Programming challenges</subtitle><link rel='alternate' type='text/html' href='http://google.com/'/><updated>2019-12-25T12:00:00</updated></feed>"
xml= etree.fromstring(xmlString)  

def get_attr(xml):
    attributes = []
    for child in (xml):
        if len(child.attrib)!= 0:
            attributes.append(child.attrib)
        get_attr(child)
    return attributes
attributes = get_attr(xml)

print(attributes)
person dipenparmar12    schedule 18.05.2019

Функция dipenparmar12 не будет возвращать дочерние атрибуты детей. Эта функция будет

import xml.etree.ElementTree as etree
xml= etree.fromstring(xmlString) 


 def get_attr(xml, attributes):
     for child in (xml):
         if len(child.attrib)!= 0:
             attributes.append(child.attrib)
         get_attr(child,attributes)
     return attributes

  attributes = get_attr(xml,[])
  print(attributes)
person möken    schedule 08.01.2021