Search code examples
pythonxmlminidom

Parsing Weather XML with Python


I'm a beginner but with a lot of effort I'm trying to parse some data about the weather from an .xml file called "weather.xml" which looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<Weather>
<locality name="Rome" alt="21">
    <situation temperature="18°C" temperatureF="64,4°F" humidity="77%" pression="1016 mb" wind="5 SSW km/h" windKN="2,9 SSW kn">
        <description>clear sky</description>
        <lastUpdate>17:45</lastUpdate>
        />
    </situation>
    <sun sunrise="6:57" sunset="18:36" />
</locality>

I parsed some data from this XML and this is how my Python code looks now:

#!/usr/bin/python

from xml.dom import minidom
xmldoc = minidom.parse('weather.xml')

entry_situation = xmldoc.getElementsByTagName('situation')
entry_locality = xmldoc.getElementsByTagName('locality')

print entry_locality[0].attributes['name'].value
print "Temperature: "+entry_situation[0].attributes['temperature'].value
print "Humidity: "+entry_situation[0].attributes['humidity'].value
print "Pression: "+entry_situation[0].attributes['pression'].value

It's working fine but if I try to parse data from "description" or "lastUpdate" node with the same method, I get an error, so this way must be wrong for those nodes which actually I can see they are differents.

I'm also trying to write output into a log file with no success, the most I get is an empty file.

Thank you for your time reading this.


Solution

  • It is because "description" and "lastUpdate" are not attributes but child nodes of the "situation" node.

    Try:

    d = entry_situation[0].getElementsByTagName("description")[0]
    print "Description: %s" % d.firstChild.nodeValue
    

    You should use the same method to access the "situation" node from its parent "locality".

    By the way you should take a look at the lxml module, especially the objectify API as yegorich said. It is easier to use.