我希望从JSON中的最后一个fm API获取特定国家/地区的顶级艺术家,并将名称和网址保存在name
和url
变量中。但它总是出现“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']
答案 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请求时可能会出现很多问题。