On Mon, Sep 19, 2011 at 9:20 PM, Sander Sweers <sander.swe...@gmail.com> wrote:
> On 17/09/11 13:08, lists wrote:
>>
>> I have been trying to learn how to parse XML with Python and learn how
>> to use xml.etree. Lots of the tutorials seem to be very long winded.
>>
>> I'm trying to access a UK postcode API at www.uk-postcodes.com to take
>> a UK postcode and return the lat/lng of the postcode. This is what the
>> XML looks like: http://www.uk-postcodes.com/postcode/HU11AA.xml
>>
>> The function below returns a dict with the xml tag as a key and the
>> text as a value. Is this a correct way to use xml.etree?
>
> Define correct, does it give the desired result? Then I would say yes it is
> correct. There may be alternative ways to get to the same result though.
>
>> def ukpostcodesapi(postcode):
>>        import urllib
>
> Why do the import here, for speed? You are reading an xml file from the
> internet, guess where most of the time is spend in your function ;-).
>
>>        import xml.etree.ElementTree as etree
>>
>>        baseURL='http://www.uk-postcodes.com/'
>>         geocodeRequest='postcode/'+postcode+'.xml'
>
> You could use string formatting here.
>  url = 'http://www.uk-postcodes.com/postcode/%s.xml' % postcode
>
> Also what would happen if postcode includes a space?
>
>>
>>        #grab the xml
>>        tree=etree.parse(urllib.urlopen(baseURL+geocodeRequest))
>
> What happens if you get an error (a 404 error perhaps)? You might want to
> add a try/except block around reading the xml from the internet.
>
>>        root=tree.getroot()
>>        results={}
>>        for child in root[1]: #here's the geo tag
>>                results.update({child.tag:child.text}) #build a dict
>> containing the
>> geocode data
>>        return results
>
> As you only get 1 set of long/lat tags in the xml you could use find(). See
> below an example.
>
> from xml.etree import ElementTree as ET
> import urllib2
>
> url = 'http://www.uk-postcodes.com/postcode/HU11AA.xml'
> xml = urllib2.urlopen(url).read()
> tree = ET.XML(xml)
>
> geo = {}
>
> for leaf in tree.find('geo'):
>    geo[leaf.tag] = leaf.text
>
> Greets
> Sander

Thank you

I've been working on this and ended up with http://pastebin.com/Y9keC9tB

Chris
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to