commit 88b972205242e1167e85cedf6924a2d81805df83 Author: Leander Hutton Date: Tue Apr 15 17:42:26 2014 -0400 Initial commit diff --git a/README b/README new file mode 100644 index 0000000..0a1308f --- /dev/null +++ b/README @@ -0,0 +1,16 @@ +Python Weather + +v 0.1 +Leander Hutton +leander@one-button.org + +This is a little script that retrieves weather information and prints it at the console. No more bother of opening a web browswer! + +Usage: weather -[z,w] -[c,f] -e (optional) +-[z.w] : use ZipCode (z) or WOEID (w) +-[c,f] : units Celcius (c default) or Fahrenheit (f) +-e : print extended forcast information + +Requires: +urllib2 +xml.dom diff --git a/weather b/weather new file mode 100755 index 0000000..31f631b --- /dev/null +++ b/weather @@ -0,0 +1,116 @@ +#!/usr/bin/env python +import sys +import getopt +import urllib2 +from xml.dom import minidom + +WEATHER_URL_ZIP = 'http://xml.weather.yahoo.com/forecastrss?p=%s&u=%s' +WEATHER_URL_WOEID = 'http://xml.weather.yahoo.com/forecastrss?w=%s&u=%s' +WEATHER_NS = 'http://xml.weather.yahoo.com/ns/rss/1.0' + +# Portions of this function borrowed from Yahoo's developer page. +# http://developer.yahoo.com/python/python-xml.html +def getWeather(location, locationtype, units): + if locationtype == 'zip': + url = WEATHER_URL_ZIP % (location,units) + dom = minidom.parse(urllib2.urlopen(url)) + forecasts = [] + + elif locationtype == 'woeid': + url = WEATHER_URL_WOEID % (location,units) + dom = minidom.parse(urllib2.urlopen(url)) + forecasts = [] + + else: + print "Not a valid location code" + return 0 + + for node in dom.getElementsByTagNameNS(WEATHER_NS, 'forecast'): + forecasts.append({ + 'date': node.getAttribute('date'), + 'low': node.getAttribute('low'), + 'high': node.getAttribute('high'), + 'condition': node.getAttribute('text') + }) + conditions = dom.getElementsByTagNameNS(WEATHER_NS, 'condition')[0] + return { + 'current_condition': conditions.getAttribute('text'), + 'current_temp': conditions.getAttribute('temp'), + 'forecasts': forecasts, + 'title': dom.getElementsByTagName('title')[0].firstChild.data + } + +def printForecast(forecasts, units): + + print("\nExtended Forecast: \n") + for day in forecasts: + for item in day: + if item == "high": + print "High" + '\t' + day[item] + units.upper() + elif item == "low": + print "Low" + '\t' + day[item] + units.upper() + elif item == "condition": + print day[item] + '\n' + else: + print day[item] + + +def usage(): + print ("Usage: weather -[z,w] -[c,f] -e (optional) ") + print ("-[z.w] : use ZipCode (z) or WOEID (w)") + print ("-[c,f] : units Celcius (c default) or Fahrenheit (f) ") + print ("-e : print extended forcast information ") + + + +def main(): + try: + units='c' + extendedforecast=False + + opts, args = getopt.getopt(sys.argv[1:], "hezwcf", ["help", "halp", "location"]) + if not opts: + print ("No options supplied") + usage() + sys.exit(2) + + for opt, arg in opts: + if opt in ("-h", "--help", "--halp"): + usage() + sys.exit(2) + elif opt == "-c": + units='c' + elif opt == "-f": + units='f' + elif opt == "-z": + locationtype="zip" + elif opt == "-w": + locationtype="woeid" + elif opt == "-e": + extendedforecast=True + else: + print ("Unknown option.") + usage() + sys.exit(2) + if not args: + print ("No location specified") + usage() + sys.exit(2) + else: + location=args[0] + + current_conditions = getWeather(location, locationtype, units) + forecasts = current_conditions['forecasts'] + + print (current_conditions['title']) + print ("Currently %s%s%s and %s" % (current_conditions['current_temp'],unichr(176),units.upper(),current_conditions['current_condition'])) + if extendedforecast is True: + printForecast(forecasts, units) + + except getopt.GetoptError,e: + print e + usage() + sys.exit(3) + +if __name__ == "__main__": + main()