Weather Underground API для получения исторических данных в Python

Я пытаюсь получить исторические данные из API Weather Underground. Я адаптировал их пример кода Python (см. Ниже). Когда я запускаю это, я получаю исключение "TypeError: индексы списка должны быть целыми числами, а не str" Поток JSON включает в себя набор полей с ежедневной сводной информацией (Dailysummary), но я не могу получить и любое из значений, которые они имеют в этом список.

Я поместил URL в просмотрщик JSON, чтобы посмотреть на структуру, и не могу понять, что я делаю неправильно. Любая помощь будет принята с благодарностью.

import urllib2
import json
f = urllib2.urlopen('http://api.wunderground.com/api/d08c4738fb303c66/geolookup/conditions/q/CA/San_Francisco.json')

json_string = f.read()
parsed_json = json.loads(json_string)
location = parsed_json['location']['city']
temp_f = parsed_json['current_observation']['temp_f']
print "Current temperature in %s is: %s" % (location, temp_f)
f.close()

h = urllib2.urlopen('http://api.wunderground.com/api/d08c4738fb303c66/history_19760508/q/CA/San_Francisco.json')
json_string = h.read()
parsed_json = json.loads(json_string)
date = parsed_json['history']['utcdate']['pretty']
print date

print type(parsed_json['history'])

snow = parsed_json['history']['dailysummary']['0']
print snow
h.close()

3 ответа

Это говорит о вашей проблеме прямо в ошибке: Вы не можете индексировать список строкой:

>>> [1]['0']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not str
>>> [1][0]
1
>>>

Но вы делаете это здесь:

snow = parsed_json['history']['dailysummary']['0']

Чтобы решить вашу проблему, сделайте ваши индексы целыми числами:

snow = parsed_json['history']['dailysummary'][0]

У меня была похожая проблема. Поскольку это список длиной 1, вы можете получить доступ к элементу списка по индексу 0. Теперь, если вы проверите тип элемента значения в индексе 0, это словарь.

type(parsed_json['history']['dailysummary'][0])
<type 'dict'>

Теперь, когда вы знаете, что это словарь, вы можете использовать ключи для доступа к значениям. В твоем случае.

print parsed_json['history']['dailysummary'][0]['snow']

Это даст вам ценность, которую вы ищете.

Позвольте мне знать, если это помогает.

Способ доступа к содержимому в parsed_json Дикт использует ключи. Вы можете найти интересующие вас ключи print parsed_json['history']['dailysummary'].keys()

Если вы сделаете это, вы увидите, что один из ключей u'snow' которая является строкой Unicode.

Вы можете использовать эту строку для доступа к данным, которые вы ищете, вместо:

parsed_json['history']['dailysummary']['0']

что вам нужно это:

parsed_json['history']['dailysummary']['snow']

Другие вопросы по тегам