On Sun, Jan 5, 2014 at 2:57 AM, Alex Kleider <[email protected]> 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 - [email protected]
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor