Warum fügen Anfragen einen Teil einer Liste zu wiederholten Abfrage-URIs hinzu?
-
21-12-2019 - |
Frage
Ich versuche, mithilfe der Requests-Bibliothek eine Variable in eine POST-Anfrage einzufügen.Hier ist mein 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
Das Ergebnis, das ich erhalte, ist folgendes (was ein Fehler ist, da es den URI durcheinander bringt):
No connection adapters were found for 'ifhttp://ws.spotify.com/search/1/track?q=ihttp://ws.spotify.com/search/1/track?q=can't'
Ich möchte, dass der Anforderungs-URI so aussieht:
"http://ws.spotify.com/search/1/track?q=if i can\'t"
Was fehlt mir hier?Gibt es eine bessere Möglichkeit, eine Variable an den Anforderungs-URI zu übergeben?Ich habe versucht, ein Wörterbuch als Nutzlast zu verwenden, kann aber keine Variable in ein Wörterbuch einfügen.
Lösung
String.join
ist sehr kontraintuitiv, die Zeichenfolge ist etwas, was Sie tun trete mit .. Ein nicht beitreten zu.
Untersuchen Sie den folgenden Code:
>>> 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'
Hier der „Tischler“ (-
) wird zwischen jedem Element in unserem Array eingefügt, das wir mithilfe des Listenverständnisses in Zeichenfolgen konvertiert haben.
Hier ist Ihr Code:
'http://ws.spotify.com/search/1/track?q='.join(split_message[:3])
Ihre Verbindungszeichenfolge lautet 'http://ws.spotify.com/search/1/track?q='
und so wird dies zwischen jedem Element im Array eingefügt split_message[:3]
.
Schauen wir uns also an, was los ist:
>>> 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"]
Hier ist das Array 3 Elemente lang, was erklärt, warum die Ausgabezeichenfolge wie folgt lautet:
ifhttp://ws.spotify.com/search/1/track?q=ihttp://ws.spotify.com/search/1/track?q=can't
Aber einige Zeilenumbrüche hinzufügen:
if
http://ws.spotify.com/search/1/track?q=
i
http://ws.spotify.com/search/1/track?q=
can't'
Beachten Sie, dass die Verbindungszeichenfolge zweimal eingefügt wird, was erklärt, warum es auf den ersten Blick so aussieht, als würde der URI durcheinander gebracht.
Was Sie stattdessen wollen, ist:
request = 'http://ws.spotify.com/search/1/track?q='+"%20".join(split_message[:3])
Beachten Sie, dass wir oben join
verwenden %20
:etwa so: "%20".join(split_message[:3])
und fügen Sie dies als Anforderungspräfix hinzu.Daraus ergibt sich die folgende URL mit korrekt codierten Leerzeichen:
"http://ws.spotify.com/search/1/track?q=if%20i%20can't"
Andere Tipps
initial_request = requests.get('http://ws.spotify.com/search/1/track?q=' +
' '.join(split_message[:3]))
s.join(seq)
klebt die Elemente zusammen seq
mit der Schnur s
stecken zwischen ihnen fest.Zum Beispiel, 'a'.join('bcd') == 'bacad'
.Beachten Sie, dass Ihre gewünschte Zeichenfolge wahrscheinlich nicht das ist, was Sie eigentlich senden sollten.sollten Sie wahrscheinlich verwenden +
statt Leerzeichen.Das Anforderungsmodul kann die URL-Parameterkodierung für Sie übernehmen:
params = {'q': ' '.join(split_message[:3])}
initial_request = requests.get('http://ws.spotify.com/search/1/track',
params=params)