#!/usr/bin/env python3 import xmltodict import urllib import datetime import json import collections # BOM Weather XML URL for my area: # # see http://www.bom.gov.au/catalogue/data-feeds.shtml # Adjust aac for your forecast region and the URL as required. aac = "NSW_PT254"; bom_url = "ftp://ftp.bom.gov.au/anon/gen/fwo/IDN11060.xml"; bom_icons = { '1': 'SUNNY.JPG', '2': 'CLEAR.JPG', '3': 'PCLOUD.JPG', '4': 'CLOUDY.JPG', '6': 'HAZE.JPG', '8': 'LRAIN.JPG', '9': 'WIND.JPG', '10': 'FOG.JPG', '11': 'SHOWER.JPG', '12': 'RAIN.JPG', '13': 'DUST.JPG', '14': 'FROST.JPG', '15': 'SNOW.JPG', '16': 'STORM.JPG', '17': 'LSHOWE.JPG', '18': 'HSHOWE.JPG', '19': 'CYCLON.JPG' } content = urllib.request.urlopen(bom_url) xmldict = xmltodict.parse(content.read()) belco = [a for a in xmldict['product']['forecast']['area'] if a['@aac'] == aac][0] new = {} #current = a['forecast-period'][0] weather = {} # The first forecast period doesn't always have the temperature and other bits # I get the overnight low and forecast to substitute when this happens. if (type(belco['forecast-period'][0]['element']) == type(collections.OrderedDict())): night = 1 else: night = 0 weather['today'] = belco['forecast-period'][0] weather['tomorrow'] = belco['forecast-period'][1] weather['day_after'] = belco['forecast-period'][2] if night: for day in weather.keys(): new[day] = {} if (day == 'today'): new[day]['day'] = 'Tonight' new[day]['max'] = [a for a in weather['tomorrow']['element'] if a['@type'] == 'air_temperature_minimum'][0]['#text'] new[day]['icon'] = bom_icons[weather['today']['element']['#text']] #bom_icons[[a for a in weather['tomorrow']['element'] if a['@type'] == 'forecast_icon_code'][0]['#text']] else: new[day]['day'] = datetime.datetime.strptime(weather[day]['@start-time-local'], "%Y-%m-%dT%H:%M:%S%z").strftime("%A") for el in weather[day]['element']: if type(el) == type(collections.OrderedDict()): if el['@type'] == "forecast_icon_code": new[day]['icon'] = bom_icons[el['#text']] elif el['@type'] == 'air_temperature_maximum': new[day]['max'] = el['#text'] else: for day in weather.keys(): new[day] = {} new[day]['day'] = datetime.datetime.strptime(weather[day]['@start-time-local'], "%Y-%m-%dT%H:%M:%S%z").strftime("%A") for el in weather[day]['element']: if type(el) == type(collections.OrderedDict()): if el['@type'] == "forecast_icon_code": new[day]['icon'] = bom_icons[el['#text']] elif el['@type'] == 'air_temperature_maximum': new[day]['max'] = el['#text'] with open('bom.json', 'w') as output: output.write(json.dumps(new)) output.close()