Stack Overflow en español Asked by L.Bar5522 on December 16, 2021
Quiero extraer todas las canciones de varias playlists de Spotify, he hecho un request
a la API de Spotify.
playlist_data = r.json()
Obtengo
{'playlists': {'href': 'https://api.spotify.com/v1/search?query=rewind-The%25&type=playlist&offset=0&limit=20',
'items': [{'collaborative': False,
'description': 'Remember what you listened to in 2010? Rewind and rediscover your favorites.',
'external_urls': {'spotify': 'https://open.spotify.com/playlist/37i9dQZF1DXc6IFF23C9jj'},
'href': 'https://api.spotify.com/v1/playlists/37i9dQZF1DXc6IFF23C9jj',
'id': '37i9dQZF1DXc6IFF23C9jj',
'images': [{'height': None,
'url': 'https://i.scdn.co/image/ab67706f0000000327ba1078080355421d1a49e2',
'width': None}],
'name': 'Rewind - The Sound of 2010',
'owner': {'display_name': 'Spotify',
'external_urls': {'spotify': 'https://open.spotify.com/user/spotify'},
'href': 'https://api.spotify.com/v1/users/spotify',
'id': 'spotify',
'type': 'user',
'uri': 'spotify:user:spotify'},
'primary_color': None,
'public': None,
'snapshot_id': 'MTU5NTUyMTQzOSwwMDAwMDAwMGQ0MWQ4Y2Q5OGYwMGIyMDRlOTgwMDk5OGVjZjg0Mjdl',
'tracks': {'href': 'https://api.spotify.com/v1/playlists/37i9dQZF1DXc6IFF23C9jj/tracks',
'total': 100}
Estoy probando con este código para que devuelva ‘id’: ’37i9dQZF1DXc6IFF23C9jj’:
for playlists in playlist_data["playlists"]:
for id in playlists["id"]:
print (id)
Recibo el error:
TypeError: string indices must be integers
¿Cómo extraigo todas las canciones de estas playlists, sus id, nombre de la canción y artista?
Recibo el error:
TypeError: string indices must be integers
Verás, iterar sobre los valores de un diccionarios no implica que la variable temporal tome el valor de cada par ordenado. Esto tiene sentido por que no hay manera de representar un solo par ordenado. Es decir, no es válido
llave: valor
Es necesario que esté entre llaves, para que sea interpretable.
¿Realmente que valor toma la variable al iterar sobre un diccionario?
Las respuesta es que toma el valor de las llaves, es decir un string. Por lo tanto una expresión como un ciclo anidado sobre los valores de un diccionario, sería equivalente a iterar sobre las letras de un string:
diccionario = {"Llave": "valor"}
for llave in diccionario:
for letra in llave:
print(letra)
mostraría
L
l
a
v
e
Lo que está ocurriendo es lo siguiente:
diccionario => for => llave como string => for => cada letra del string
La variable del primer ciclo toma el valor de cada llave (string) mientras, que la variable del segundo ciclo toma el valor de cada letra de dicha llave.
Dicho esto el error tiene más sentido. La expresión
for playlists in playlist_data["playlists"]:
for id in playlists["id"]:
print (id)
Estaría dando las instrucciones
"playlists"
en el diccionario playlist_data
"playlists"
en el diccionario playlist_data
Como es de esperar, terminará en error. Esto por que los indices de un string tienen que ser números enteros, osea que el indice "id"
no es válido. Sería como decir
print("string"["letra"])
Dicho esto, surge otra pregunta: ¿Es necesaria está iteración?
El primer indice de izquierda a derecha equivale a 0 y último índice de derecha a izquierda equvale a -1
0 1 2 3
| | | |
* * * *
[1, 2, 3, 4]
* * * *
| | | |
-4 -3 -2 -1
¿Cómo extraigo todas las canciones de estas playlists?
Debes de localizarlo en el diccionario. Analizando el diccionario, te darás cuenta que la llave "tracks"
está dentro del diccionario que está en la lista que tiene como valor "items"
, que es una llave que tiene el diccionario que tiene como valor la llave "playlists"
.
Por lo tanto con:
canciones = playlist_data["playlists"]["items"][0]["tracks"]
Se obtendría
{'href': 'https://api.spotify.com/v1/playlists/37i9dQZF1DXc6IFF23C9jj/tracks', 'total': 100}
Si se deseara obtener el enlace, solo basta con añadir la especificación de la llave "href"
playlist_data["playlists"]["items"][0]["tracks"]["href"]
¿Cómo extraigo todas las canciones de estas playlists, sus id, nombre de la canción y artista?
De esta misma manera, se puedes obtener cualquier elemento del diccionario. Eso ya te toca hacerlo a ti.
Espero haberte ayudado.
Answered by user166844 on December 16, 2021
Ver los datos de esta forma puede ser muy complicado a menos que llevas los resultados a un visualizador de JSON. Puedes hacer lo mismo en Python con:
import json
print(json.dumps(playlist_data, indent=4))
Por otro lado, al ver la estructura de la respuesta verás por que el código falla. Al incocar a playlista_data['playlist'] lo que hace es retornar las llaves del diccionario interno que son 'href' y 'items' como str
.
Por otro lado, id
es una palabra reservada en Python. En lugar de eso, utilizar id_
.
Lo que tienes que hacer es ir navegando la estructura con indices concatenados de esta forma:
playlist_data['playlists']['items'][0]['id']
Esto te retornará el id del playlist
Answered by Luis Munoz on December 16, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP