On Sun, Jan 5, 2014 at 2:57 AM, Alex Kleider <aklei...@sonic.net> wrote: > def ip_info(ip_address): > > response = urllib2.urlopen(url_format_str %\ > (ip_address, )) > encoding = response.headers.getparam('charset') > print "'encoding' is '%s'." % (encoding, ) > info = unicode(response.read().decode(encoding))
decode() returns a unicode object. > n = info.find('\n') > print "location of first newline is %s." % (n, ) > xml = info[n+1:] > print "'xml' is '%s'." % (xml, ) > > tree = ET.fromstring(xml) > root = tree.getroot() # Here's where it blows up!!! > print "'root' is '%s', with the following children:" % (root, ) > for child in root: > print child.tag, child.attrib > print "END of CHILDREN" > return info Danny walked you through the XML. Note that he didn't decode the response. It includes an encoding on the first line: <?xml version="1.0" encoding="ISO-8859-1" ?> Leave it to ElementTree. Here's something to get you started: import urllib2 import xml.etree.ElementTree as ET import collections url_format_str = 'http://api.hostip.info/?ip=%s&position=true' GML = 'http://www.opengis.net/gml' IPInfo = collections.namedtuple('IPInfo', ''' ip city country latitude longitude ''') def ip_info(ip_address): response = urllib2.urlopen(url_format_str % ip_address) tree = ET.fromstring(response.read()) hostip = tree.find('{%s}featureMember/Hostip' % GML) ip = hostip.find('ip').text city = hostip.find('{%s}name' % GML).text country = hostip.find('countryName').text coord = hostip.find('.//{%s}coordinates' % GML).text lon, lat = coord.split(',') return IPInfo(ip, city, country, lat, lon) >>> info = ip_info('201.234.178.62') >>> info.ip '201.234.178.62' >>> info.city, info.country (u'Bogot\xe1', 'COLOMBIA') >>> info.latitude, info.longitude ('10.4', '-75.2833') This assumes everything works perfect. You have to decide how to fail gracefully for the service being unavailable or malformed XML (incomplete or corrupted response, etc). _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor