TypeError:字节索引必须是整数

时间:2017-11-17 12:28:27

标签: python

我希望从JSON中的最后一个fm API获取特定国家/地区的顶级艺术家,并将名称和网址保存在nameurl变量中。但它总是出现“TypeError:字节索引必须是整数”。你知道问题出在哪里吗?

工作示例:

import requests

api_key = "xxx"     


for i in range(2,5):

    artists = requests.get('http://ws.audioscrobbler.com/2.0/?method=geo.gettopartists&country=spain&format=json&page='+str(i)+'&api_key='+api_key)
    for artist in artists:

        print(artist)

        #name = artist['topartists']['artist']['name']
        #url  = artist['topartists']['artist']['url']

1 个答案:

答案 0 :(得分:3)

你想:

response = requests.get(...)
data = response.json()
for artist in data["topartists"]["artist"]:
    name = artist["name"]
    # etc

说明:requests.get()返回response个对象。迭代响应对象实际上是逐行迭代原始文本响应内容。由于此内容实际上是json,因此您希望首先将其解码为Python(response.json()主要是json.loads(response.content)的快捷方式)。然后你得到一个python dict,在这种情况下,是一个单词“topartists”,它指向一个“艺术家”词典列表。

一些提示:

首先,您可能希望学习使用字符串格式而不是字符串连接。这个:

'http://ws.audioscrobbler.com/2.0/?method=geo.gettopartists&country=spain&format=json&page='+str(i)+'&api_key='+api_key

丑陋且几乎无法读取。使用字符串格式:

urltemplate = "http://ws.audioscrobbler.com/2.0/?method=geo.gettopartists&country=spain&format=json&page={page}&api_key={api_key}"
url = urltemplate.format(page=i, api_key=api_key)

但实际上requests知道如何从dict构建查询字符串,所以你应该真的使用它:

query = {
    "method": "geo.gettopartists", 
    "country":"spain", 
    "format":"json", 
    "api_key": api_key
    }

url = "http://ws.audioscrobbler.com/2.0/"
for pagenum in range(x, y):
    query["page"] = pagenum
    response = requests.get(url, params=query)
    # etc

然后,您可能还想处理错误 - 执行HTTP请求时可能会出现很多问题。