所以我试图用Python将一个简单的东西发布到我的页面上。
r = requests.Session().post(
'http://mypage.com/add?token=%s&title=%s&opt=&opt=true&token=%s' % (token, title, token),
headers = headers,
proxies = proxy,
timeout = max_timeout,
)
问题是:如果是title
,例如Hello World!
,则效果很好,但如果title
为Hello World! Visit www.google.com
则无法正常工作。
我到目前为止发现的是title
字符串如果包含标点符号则不会发送,在这种情况下www.google.com
有两个.
所以它不会发布... < / p>
这在Python中是正常的吗?我还尝试使用urllib.quote
urllib.urlencode
等等,但结果相同......
此外,如果你问我为什么不在data = mydata
内使用post()
对象是因为,如果你注意到了,我使用了参数token
和opt
两次,所以如果我像这样制作一个data
对象:
data = {
"token": token,
"title": "title",
"opt": "",
"opt": 'value',
"token": token
}
显然它不会起作用,因为它有重复的key
值。
答案 0 :(得分:3)
您正在发布一个空主体,并且仅使用查询参数。 requests
可以在请求参数和POST正文中发送重复的密钥。您所要做的就是使用一系列键值元组而不是字典:
params = [
("token", token),
("title", "title"),
("opt", ""),
("opt", 'value'),
("token": token),
]
当用作查询参数或application / x-www-form-urlencoded POST正文时,这些将被编码。
要将这些作为POST正文发送,请使用data
关键字参数:
requests.post('http://mypage.com/add', data=params,
headers = headers, proxies = proxy, timeout = max_timeout)
或使用params
将这些作为查询参数发送(在网址中):
requests.post('http://mypage.com/add', params=params,
headers = headers, proxies = proxy, timeout = max_timeout)