3

我正在尝试从 Weather Underground API 中提取历史数据。我改编了他们的 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()
4

3 回答 3

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]
于 2013-08-26T18:59:54.997 回答
1

我有一个类似的问题。由于它是长度为 1 的列表,您可以通过索引 0 访问列表项。现在,如果您检查索引 0 中值项的类型,它是一个字典。

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

现在,您知道它是一个字典,您可以使用键来访问值。在你的情况下。

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

这为您提供了您正在寻找的价值。

让我知道这是否有帮助。

于 2016-04-13T20:33:09.180 回答
0

访问parsed_jsondict 中内容的方法是使用键。您可以找到您有兴趣使用的密钥print parsed_json['history']['dailysummary'].keys()

如果你这样做,你会看到其中一个键是u'snow'unicode 字符串。

您可以使用该字符串来访问您要查找的数据,而不是:

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

你需要的是:

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

于 2014-05-08T18:09:39.980 回答