Почему запросы добавляют часть списка к повторяющимся URI запроса?

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

Вопрос

Я пытаюсь поместить переменную в запрос POST, используя библиотеку Requests.Вот мой код:

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

Результат, который я получаю, таков (это ошибка, поскольку он портит 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'

Я бы хотел, чтобы URI запроса выглядел так:

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

Что мне здесь не хватает?Есть ли лучший способ передать переменную в URI запроса?Я попробовал использовать словарь в качестве полезной нагрузки, но не могу поместить в словарь переменную.

Это было полезно?

Решение

String.join это очень нелогично, строка - это то, что вы присоединиться к нет присоединиться к.

Изучите следующий код:

>>> 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'

Здесь "столяр" (-) вставляется между каждым элементом в нашем массиве, который мы преобразовали в строки, используя понимание списка.

Вот ваш код:

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

Ваша соединяющая строка - это 'http://ws.spotify.com/search/1/track?q=' и таким образом, это вставляется между каждым элементом в массиве split_message[:3].

Итак, давайте разберемся, что происходит:

>>> 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"]

Здесь массив имеет длину в 3 элемента, что объясняет, почему выходная строка является:

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

Но добавление некоторых разрывов строк:

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

Обратите внимание, что соединяющая строка вставляется дважды, что объясняет, почему на первый взгляд это выглядит просто как искажение URI.

Вместо этого вы хотите вот чего:

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

Обратите внимание, что в приведенном выше примере мы join используя %20:вот так: "%20".join(split_message[:3]) и добавьте к этому префикс запроса.Который выдает приведенный ниже URL-адрес с правильно закодированными пробелами:

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

Другие советы

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

s.join(seq) склеивает элементы seq со строкой s застрял между ними.Например, 'a'.join('bcd') == 'bacad'.Обратите внимание, что желаемая строка, вероятно, не та, которую вам действительно следует отправлять;вам, вероятно, следует использовать + вместо пробелов.Модуль запросов может обрабатывать кодирование параметров URL-адреса за вас:

params = {'q': ' '.join(split_message[:3])}
initial_request = requests.get('http://ws.spotify.com/search/1/track',
                               params=params)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top