73

For:

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

How do I get "value"?

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

Throws an error.

0

6 Answers 6

90

This will find the first instance of an element named bar and return the value of the attribute 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'
Sign up to request clarification or add additional context in comments.

1 Comment

@Stevoisiak, i have similar problem <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> I would like to access "Car" from the attribute.
15

Getting child tag's attribute value in a XML using ElementTree

Parse the XML file and get the root tag and then using [0] will give us first child tag. Similarly [1], [2] gives us subsequent child tags. After getting child tag use .attrib[attribute_name] to get value of that attribute.

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

If the xml content is in file. You should do below task to get the root.

>>> tree = ET.parse('file.xml')
>>> root = tree.getroot()

1 Comment

I get error saying AttributeError: 'builtin_function_or_method' object has no attribute 'fromstring'
3

By following method you can get all attributes from xml (in Dictionary)

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)

Comments

1

dipenparmar12 function will not return the childrens child attributes. Because the function is recursive the attributes list will be set to a empty list for each call. This function will has return the childrens child.

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)

Comments

0

Your expression:

./bar[@key]

It means: bar children having key attribute

If you want to select the attribute, use this relative expression:

bar/@key

It means: the key attribute of bar children

Of course, you need to consider to use a fully compliant XPath engine like lxml.

4 Comments

Not sure if it's ElementTree or Google App Engine but the use of '@' raises SyntaxError("unsupported path syntax (%s)" % op) SyntaxError: unsupported path syntax (@)
@Will Merydith: Please, read my last sentence. Basic ElementTree API it's not a full complain XPath engine...
OK. I'll see if I can find a module that will work on GAE/Py2.5.5.
It seems that python ElementTree does not support syntax like bar/@key and you have to use xxx.attribut.get("key") for the appropriate xxx.
-1

For going deeper into the tree this type of functions can be used.

root[1][2][0].tag  # For displaying the nodes
root[1][2][0].text # For showing what's inside the node

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.