Monday, July 6, 2009

Simple unit convertor in python

This function uses the google calculator api
http://www.google.com/ig/calculator?hl=en&q=1EUR%3D%3FUSD

import urllib, urllib2
import socket

# Crawl header #
default_header = { 'User-Agent' :
'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121622 Ubuntu/8.10 (intrepid) Firefox/3.0.5;'}

def getpage(pageurl, pageargs = None, pageheaderargs = {}):
fail = 0
content = reply_header = None
pageheaders = default_header
pageheaders.update(pageheaderargs)
while True:
print pageurl
retry = 0
try:
params = urllib.urlencode(pageargs) if pageargs else None
req = urllib2.Request(pageurl, params, pageheaders)
page = urllib2.urlopen(req)
content = page.read()
reply_header = str(page.headers).split('\r\n')
page.close()
except urllib2.HTTPError, e:
retry = 1
except IOError, e:
retry = 1
except socket.timeout, e:
retry = 1
except socket.sslerror, e:
retry = 1
if retry:
fail += 1
if fail == 5:
print 'Failed to retrieve' + pageurl + ': ' + str(e)
return (reply_header, content)
else:
continue
break
return (reply_header, content)

def convert(unit1, unit2):
query = '1%s=?%s' % (unit1, unit2)
(header, content) = getpage('http://www.google.com/ig/calculator?hl=en&q=' + query)
reresult = re.search('rhs: \"(.*?) ', content)
result = reresult.expand(r'\1') if reresult else 'Error'
return result if result != '' else 'Error'