我是来自特定国家/地区的顶级艺术家,该艺术家的专辑以及来自lastfm api的专辑的曲目。我没有错误地获得艺术家和专辑,但是在曲目中它出现了:
for album in album_response['album']['tracks']['track']: KeyError: 'album'
问题似乎是因为一些艺术家的名字中有空格,所以我用" +"还有"%2b"但没有解决方案正常工作它总是出现上面的错误。
chosen = artists[i]['name'].replace(" ", "+")
chosen = '+'.join(artists[i]['name'].lower().split())
chosen = artists[i]['name'].replace(" ", "%2B")
轨道部分出错:
tracks = {}
for i,v in albums.items():
artist = albums[i]['artist'].replace(" ","+")
name = albums[i]['name'].replace(" ", "+")
album_response_data = requests.get('http://ws.audioscrobbler.com/2.0/?method=album.getinfo&format=json&api_key='+api_key+'&artist='+artist+'&album='+name)
album_response = album_response_data.json()
print(album_response)
for album in album_response['album']['tracks']['track']:
title = album['name']
number = album['@attr']['rank']
duration = album['duration']
tracks[ID] = {}
tracks[ID]['title'] = title
tracks[ID]['number'] = number
tracks[ID]['artist'] = albums[i]['artist']
tracks[ID]['album'] = albums[i]['name']
tracks[ID]['albumID'] = albums[i]['ID']
tracks[ID]['duration'] = duration
ID += 1
最低工作例子:
import requests
api_key = "b088cbedecd40b35dd89e90f55227ac2"
ID= 0
#Get artists from specific country
artists = {}
for i in range(2, 3):
artists_response = requests.get(
'http://ws.audioscrobbler.com/2.0/?method=geo.gettopartists&country=spain&format=json&page=' + str(i) + '&api_key=' + api_key)
artists_data = artists_response.json()
for artist in artists_data["topartists"]["artist"]:
name = artist["name"]
url = artist["url"]
#if ID > 3 continue
artists[ID] = {}
artists[ID]['ID'] = ID
artists[ID]['name'] = name
ID += 1
#Get TopAlbums info from above artists
albums = {}
for i, v in artists.items():
chosen = artists[i]['name'].replace(" ", "+")
topalbums_response = requests.get(
'http://ws.audioscrobbler.com/2.0/?method=artist.gettopalbums&format=json&artist=' + chosen + '&api_key=' + api_key + '&limit=5')
albums_data = topalbums_response.json()
for album in albums_data['topalbums']['album']:
name = album["name"]
url = album["url"]
albums[ID] = {}
albums[ID]['ID'] = ID
albums[ID]['artist'] = artists[i]['name']
albums[ID]['artistID'] = artists[i]['ID']
albums[ID]['name'] = name
albums[ID]['url'] = url
ID += 1
#Get tracks info of the above albums
tracks = {}
for i,v in albums.items():
artist = albums[i]['artist'].replace(" ","+")
name = albums[i]['name'].replace(" ", "+")
album_response_data = requests.get('http://ws.audioscrobbler.com/2.0/?method=album.getinfo&format=json&api_key='+api_key+'&artist='+artist+'&album='+name)
album_response = album_response_data.json()
for album in album_response['album']['tracks']['track']:
title = album['name']
number = album['@attr']['rank']
duration = album['duration']
tracks[ID] = {}
tracks[ID]['trackID'] = ID
tracks[ID]['title'] = title
tracks[ID]['number'] = number
tracks[ID]['artist'] = albums[i]['artist']
tracks[ID]['album'] = albums[i]['name']
tracks[ID]['albumID'] = albums[i]['ID']
tracks[ID]['duration'] = duration
ID += 1
答案 0 :(得分:1)
问题是,在您收到错误的情况下,album_response是{'error': 6, 'message': 'Album not found', 'links': []}
我添加了一行来打印出在循环中处理的艺术家和专辑的名称,我看到艺术家是Ed Sheeran,但没有相关的专辑。
我不确定为什么会发生这种情况,但我会告诉您需要修复循环变量。在python中,变量在函数范围内,但不在控制结构中。您有嵌套循环,它们都使用i
作为循环中的变量。当内循环前进i
时,这通常会引起冲突,外循环会看到这些进展。
答案 1 :(得分:1)
您的问题在于相册词典中的记录键19:
19:{'ID':19,'艺术家':'Ed Sheeran','artistID':3,'image': 'https://lastfm-img2.akamaized.net/i/u/174s/d08fbb920e514f5c893d95552379d3fc.png', 'name':'+','url':'https://www.last.fm/music/Ed+Sheeran/%252B'}
请注意,相册的名称是“+”加号。
您需要将“+”urlencode为%2B 或者用%2B替换“+”。
否则你会回来 'message':'未找到相册'....