为什么请求是将列表的一部分添加到重复的查询URI?

时间:2014-01-09 03:46:20

标签: python variables post python-requests

我正在尝试使用Requests库将变量放入POST请求中。这是我的代码:

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?我尝试使用字典作为有效负载,但我无法将变量放入字典中。

2 个答案:

答案 0 :(得分:3)

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'

这里“joiner”(-)插入到数组中的每个元素之间,我们使用列表推导将其转换为字符串。

这是你的代码:

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

答案 1 :(得分:0)

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)