Ну, вот и все - неполное решение парсера для вашего конкретного случая:
import urllib
def getWeather(city):
''' given city name or postal code,
return dictionary with current weather conditions
'''
url = 'http://www.google.com/ig/api?weather='
try:
f = urllib.urlopen(url + urllib.quote(city))
except:
return "Error opening url"
s = f.read().replace('\r','').replace('\n','')
if '<problem' in s:
return "Problem retreaving weather (invalid city?)"
weather = s.split('</current_conditions>')[0] \
.split('<current_conditions>')[-1] \
.strip('</>')
wdict = dict(i.split(' data="') for i in weather.split('"/><'))
return wdict
и пример использования:
>>> weather = getWeather('94043')
>>> weather
{'temp_f': '67', 'temp_c': '19', 'humidity': 'Humidity: 61%', 'wind_condition': 'Wind: N at 21 mph', 'condition': 'Sunny', 'icon': '/ig/images/weather/sunny.gif'}
>>> weather['humidity']
'Humidity: 61%'
>>> print '%(condition)s\nTemperature %(temp_c)s C (%(temp_f)s F)\n%(humidity)s\n%(wind_condition)s' % weather
Sunny
Temperature 19 C (67 F)
Humidity: 61%
Wind: N at 21 mph
PSОбратите внимание, что довольно тривиальное изменение в формате вывода Google сломает это - скажем, если бы они добавили дополнительные пробелы или табуляции между тегами или атрибутами.Чего они избегают, чтобы уменьшить размер http ответа.Но если бы они это сделали, нам пришлось бы знакомиться с регулярными выражениями и re.split ()
PPS.как str.split(sep)
работает, объясняется в документации, вот выдержка: Возвращает список слов в строке, используя sep в качестве строки-разделителя.... Аргумент sep может состоять из нескольких символов (например, '1 <> 2 <> 3' .split ('<>') возвращает ['1', '2', '3']) ,Так что 'text1<tag>text2</tag>text3'.split('</tag>')
дает нам ['text1<tag>text2', 'text3']
, затем [0]
берет 1-й элемент 'text1<tag>text2'
, затем мы разбиваемся и выбираем 'text2', который содержит данные, которые нас интересуют. Действительно банально.