Access element and tag in xml file using ElementTree

12,212

You can iterate over the listings one by one and then get the inner description and address child elements. To access the attributes, use .attrib attribute:

import xml.etree.ElementTree as ET


data = ET.parse('data.xml')
root = data.getroot()
for listing in root.findall("listing"):
    address = listing.find('address')
    description = listing.findtext('description')

    print(description, address.attrib.get("key"))
Share:
12,212
Chuck
Author by

Chuck

I'd rather be doing Physics

Updated on June 04, 2022

Comments

  • Chuck
    Chuck almost 2 years

    Many thanks for your reading. I apologise for such a beginner question for what I am sure is a simple answer. Any guidance is much appreciated.

    I have an xml file which I am parsing with ElementTree, which has elements which look like this:

    data.xml:
    <?xml version="1.0" encoding="utf-8"?><listings><listing id="26496000" dateFirstListed="2012-10-13" dateLastListed="2013-10-06" market="SALE" propertyType="DETACHED" bedrooms="4" latestAskingPrice="314950"><address key="u935d·0" udprn="50812465" line1="12 Millcroft" line2="Millhouse Green" town="SHEFFIELD" postcode="S36 9AR" /><description>  SOME TEXT HERE </description></listing>
    

    I want to access <description> tag and <address key>.

    Using the guide set out at https://docs.python.org/2/library/xml.etree.elementtree.html I write:

    import xml.etree.ElementTree
    data = xml.etree.ElementTree.parse('data.xml')
    root = data.getroot()
    

    and iterate over the child elements:

    for child in root:
        print child.tag, child.attrib
    >
    listing {'dateLastListed': '2013-10-06', 'dateFirstListed': '2012-10-13', 'propertyType': 'DETACHED', 'latestAskingPrice': '314950', 'bedrooms': '4', 'id': '26496000', 'market': 'SALE'}
    

    This only gives me the child elements for the <listing> tag. How can I change the above expression to access <address key> and <description>?

    Edit: Following guidance from this question Parsing XML with Python - accessing elements

    I tried writing:

    for i in root.findall("listing"):
        description = i.find('description')
        print description.text
    
        >
        AttributeError: 'NoneType' object has no attribute 'text'