Pourquoi les requêtes ajoutent-elles une partie d’une liste aux URI de requêtes répétées ?

StackOverflow https://stackoverflow.com//questions/21011262

Question

J'essaie de placer une variable dans une requête POST à ​​l'aide de la bibliothèque Requests.Voici mon code :

import requests

message = "if i can\'t let it go out of my mind"

split_message = message.split()

initial_request = requests.get('http://ws.spotify.com/search/1/track?q='.join(split_message[:3]))
print initial_request.content

Le résultat que j'obtiens est le suivant (ce qui est une erreur, car cela gâche l'URI) :

No connection adapters were found for 'ifhttp://ws.spotify.com/search/1/track?q=ihttp://ws.spotify.com/search/1/track?q=can't'

J'aimerais que l'URI de la requête ressemble à ceci :

"http://ws.spotify.com/search/1/track?q=if i can\'t"

Qu'est-ce que j'oublie ici?Existe-t-il une meilleure façon de transmettre une variable à l'URI de la requête ?J'ai essayé d'utiliser un dictionnaire comme charge utile, mais je ne parviens pas à placer une variable dans un dictionnaire.

Était-ce utile?

La solution

String.join est très contre-intuitif, la chaîne est quelque chose que vous se joindre à pas se joindre à.

Examinez le code suivant :

>>> x = range(5)
>>> x
[0, 1, 2, 3, 4]
>>> x = [str(c) for c in x]
>>> x
['0', '1', '2', '3', '4']
>>> "-".join(x)
'0-1-2-3-4'

Ici le "menuisier" (-) est inséré entre chaque élément de notre tableau, que nous avons converti en chaînes en utilisant la compréhension de liste.

Voici votre code :

'http://ws.spotify.com/search/1/track?q='.join(split_message[:3])

Votre chaîne de jointure est 'http://ws.spotify.com/search/1/track?q=' et donc ceci est inséré entre chaque élément du tableau split_message[:3].

Examinons donc ce qui se passe :

>>> message = "if i can\'t let it go out of my mind"
>>> split_message = message.split()
>>> split_message
['if', 'i', "can't", 'let', 'it', 'go', 'out', 'of', 'my', 'mind']
>>> split_message[:3]
['if', 'i', "can't"]

Ici, le tableau comporte 3 éléments, ce qui explique pourquoi la chaîne de sortie est :

 ifhttp://ws.spotify.com/search/1/track?q=ihttp://ws.spotify.com/search/1/track?q=can't

Mais en ajoutant quelques sauts de ligne :

 if
   http://ws.spotify.com/search/1/track?q=
 i
   http://ws.spotify.com/search/1/track?q=
 can't'

Notez que la chaîne de jonction est insérée deux fois, ce qui explique pourquoi, à première vue, elle semble simplement gâcher l'URI.

Ce que vous voulez à la place, c'est :

request = 'http://ws.spotify.com/search/1/track?q='+"%20".join(split_message[:3])

Remarquez, dans ce qui précède, nous join en utilisant %20:ainsi: "%20".join(split_message[:3]) et ajoutez ceci le préfixe de la demande.Ce qui donne l'URL ci-dessous, avec les espaces correctement codés :

"http://ws.spotify.com/search/1/track?q=if%20i%20can't"

Autres conseils

initial_request = requests.get('http://ws.spotify.com/search/1/track?q=' +
                               ' '.join(split_message[:3]))

s.join(seq) rassemble les éléments de seq avec la ficelle s coincé entre eux.Par exemple, 'a'.join('bcd') == 'bacad'.Notez que la chaîne souhaitée n'est probablement pas celle que vous devriez réellement envoyer ;vous devriez probablement utiliser + au lieu d'espaces.Le module de requêtes peut gérer l'encodage des paramètres d'URL pour vous :

params = {'q': ' '.join(split_message[:3])}
initial_request = requests.get('http://ws.spotify.com/search/1/track',
                               params=params)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top