Get Weather from the commandline
April 28, 2008 Leave a comment
This is a program written in python that gets the weather from the command line.
The usage is like:
$ weather.py 83204
5-day Forcast for 83206
---------------------
Monday Tuesday Wednesday Thursday Friday
High: 74 68 47 49 58
Low: 43 34 29 27 32
It breaks occasionally, most likely because wunderground’s output isn’t consistant. but the whole point of this program is to figure out urllib and urllib2 to the networking class, so it’s no big deal to me.
Here’s the code:
#!/usr/bin/env python
"""
This is the most useful program ever
Because it tells you all about the weather
I'm a poet
and I didn't
even realize
that I was one
Actually, this program is at the mercy of wunderground's output,
so it can break very very easily - but seemed to work for me in
the handfull of cases I tried it on. The point is to demonstrate urllib
to my network class
"""
import sys, re, urllib2, urllib
def numError():
"""Exits with a usage note"""
print "Usage: weather zipcode"
sys.exit(1)
def addGETdata(url, data):
"""Adds the get data to the url. data should be a tuple"""
return url + '?' + urllib.urlencode(data)
def printToScreen(areacode, high, low, days):
print "5-day Forcast for ", areacode, "\n---------------------"
print " ",
for i in days:
print i,
print ''
print 'High: ',
for i in high:
print i," ",
print ''
print 'Low: ',
for i in low:
print i," ",
print ''
#Check that the user passes a 5-digit zip
try:
zip = int(sys.argv[1])
except:
numError()
if (len(sys.argv[1]) != 5):
numError()
#make the get request
fullurl = addGETdata("http://www.wunderground.com/cgi-bin/findweather/getForecast", [("query",sys.argv[1])])
req = urllib2.Request(fullurl)
fd = urllib2.urlopen(req)
high = []
low = []
days = []
while 1:
data = fd.read(2056)
if not len(data):
break
"""this is not efficient, but works
and in reality, the bottleneck is fetching the website"""
#find what the next 5 days are
m = re.findall('<td class="taC" style="width: 20%;">.*y', data)
for i in m:
#append the days
days.append(i.rsplit('<td class="taC" style="width: 20%;">')[1])
#find the high for the next five days
m = re.findall('<span style="color: #900;">.*F', data)
for i in m:
#append only the integers of the weather
high.append(i.rsplit('<span style="color: #900;">')[1].rstrip("° F"))
#find the lows for the next five days
m = re.findall('<span style="color: #009;">.*F', data)
for i in m:
#append only the integers of the weather
low.append(i.rsplit('<span style="color: #009;">')[1].rstrip("° F"))
printToScreen(sys.argv[1], high, low, days)

