我正在尝试从Weather Underground API中提取历史数据。我改编了他们的Python示例代码(见下文)。当我运行这个时,我得到一个异常“TypeError:list indices必须是整数,而不是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()
答案 0 :(得分:2)
它在错误中说明了您的问题:您无法使用字符串索引列表:
>>> [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 :(得分:1)
我有类似的问题。由于它是长度为1的列表,因此您可以通过索引0访问列表项。现在,如果检查索引0中值项的类型,则它是字典。
type(parsed_json['history']['dailysummary'][0])
<type 'dict'>
现在,您知道它是字典,您可以使用键来访问值。在你的情况下。
print parsed_json['history']['dailysummary'][0]['snow']
这可以为您提供所需的价值。
如果有帮助,请告诉我。
答案 2 :(得分:0)
访问parsed_json
dict中的内容的方法是使用密钥。您可以使用print parsed_json['history']['dailysummary'].keys()
如果你这样做,你会看到其中一个键是u'snow'
,这是一个unicode字符串。
您可以使用该字符串访问您正在查找的数据,而不是:
parsed_json['history']['dailysummary']['0']
你需要的是:
parsed_json['history']['dailysummary']['snow']