在Python列表中存储API数据时出现问题

时间:2018-12-10 19:15:32

标签: python json python-3.x

我正在努力解决从API获得的json数据。我进入了几个api URL来获取我的数据,并将其存储在一个空列表中。然后,我想删除所有说“声誉”的字段,而我只对该数字感兴趣。在这里查看我的代码:

import json
import requests

f = requests.get('my_api_url')
if(f.ok):
    data = json.loads(f.content)

url_list = [] #the list stores a number of urls that I want to request data from

for items in data:
    url_list.append(items['details_url']) #grab the urls that I want to enter

total_url = [] #stores all data from all urls here   

for index in range(len(url_list)):
    url = requests.get(url_list[index])
    if(url.ok):
    url_data = json.loads(url.content)
    total_url.append(url_data)

print(json.dumps(total_url, indent=2)) #only want to see if it's working

到目前为止,我很高兴,可以输入所有url并获取数据。在下一步,我会遇到麻烦。上面的代码为我输出以下json数据:

[
  [
    {
      "id": 316,
      "name": "storabro",
      "url": "https://storabro.net",
      "customer": true,
      "administrator": false,
      "reputation": 568
    }
  ],
  [
    {
      "id": 541,          
      "name": "sega",
      "url": "https://wedonthaveanyyet.com",
      "customer": true,
      "administrator": false,
      "reputation": 45
    },
    {
      "id": 90,
      "name": "Villa",
      "url": "https://brandvillas.co.uk",
      "customer": true,
      "administrator": false,
      "reputation": 6
    }
  ]
]

但是,我只想打印出信誉,但我无法使其正常运行。如果我在我的代码中改用print(total_url['reputation']),则它不起作用并显示"TypeError: list indices must be integers or slices, not str",如果我尝试:

for s in total_url: print(s['reputation']) 我得到相同的TypeError。

感觉就像我已经尝试了一切,但是在网络上找不到任何可以帮助我的答案,但是我知道我还有很多东西要学习,而且我的错误对于这里的某些人来说很明显。似乎与我使用Python完成的其他操作非常相似,但是这次我遇到了麻烦。为了澄清,我期望输出类似于:[568, 45, 6]

也许从一开始我就使用了错误的方法,这就是为什么它对我而言并非一直有效的原因。十月份开始使用Python进行编码,对我来说它仍然很新,但是我想学习。预先谢谢大家!

2 个答案:

答案 0 :(得分:0)

您的total_url似乎是一个列表列表,因此您可以编写如下函数:

def get_reputations(data):
    for url in data:
        for obj in url:
            print(obj.get('reputation'))

get_reputations(total_url)

# output:
# 568
# 45
# 6

如果您不想首先使用列表列表,则可以使用每个结果extend来代替列表,而不用append来构造total_url的表达式

答案 1 :(得分:0)

您还可以使用json.load并尝试读取响应

def get_rep():
response = urlopen(api_url)
r = response.read().decode('utf-8')
r_obj = json.loads(r)
for item in r_obj['response']:
    print("Reputation: {}".format(item['reputation']))