我正在尝试使用python中的requests.get()获取以下格式的URL:
http://api.example.com/export/?format=json&key=site:dummy+type:example+group:wheel
#!/usr/local/bin/python
import requests
print(requests.__versiom__)
url = 'http://api.example.com/export/'
payload = {'format': 'json', 'key': 'site:dummy+type:example+group:wheel'}
r = requests.get(url, params=payload)
print(r.url)
但是,URL会被编码百分比,但我没有得到预期的响应。
2.2.1
http://api.example.com/export/?key=site%3Adummy%2Btype%3Aexample%2Bgroup%3Awheel&format=json
如果我直接传递URL,这是有效的:
url = http://api.example.com/export/?format=json&key=site:dummy+type:example+group:wheel
r = requests.get(url)
有没有办法以原始形式传递参数 - 没有百分比编码?
谢谢!
答案 0 :(得分:32)
这不是一个好的解决方案,但您可以使用string
:
r = requests.get(url, params='format=json&key=site:dummy+type:example+group:wheel')
顺便说一句:
payload = {'format': 'json', 'key': 'site:dummy+type:example+group:wheel'}
payload_str = "&".join("%s=%s" % (k,v) for k,v in payload.items())
# 'format=json&key=site:dummy+type:example+group:wheel'
r = requests.get(url, params=payload_str)
答案 1 :(得分:9)
按设计,解决方案是直接传递URL。
答案 2 :(得分:8)
如果将来遇到其他人,您可以继承requests.Session,覆盖send方法,并更改原始URL,以修复百分比编码等。 我们欢迎对以下内容进行更正。
import requests, urllib
class NoQuotedCommasSession(requests.Session):
def send(self, *a, **kw):
# a[0] is prepared request
a[0].url = a[0].url.replace(urllib.quote(","), ",")
return requests.Session.send(self, *a, **kw)
s = NoQuotedCommasSession()
s.get("http://somesite.com/an,url,with,commas,that,won't,be,encoded.")
答案 3 :(得分:2)
上面的答案对我不起作用。
我试图在参数包含管道的情况下执行get请求,但python请求也会对管道进行百分比编码。所以 相反,我使用了urlopen:
# python3
from urllib.request import urlopen
base_url = 'http://www.example.com/search?'
query = 'date_range=2017-01-01|2017-03-01'
url = base_url + query
response = urlopen(url)
data = response.read()
# response data valid
print(response.url)
# output: 'http://www.example.com/search?date_range=2017-01-01|2017-03-01'
答案 4 :(得分:0)
请查看此github link中的第一个选项。您可以忽略urlib
部分,而不是prep.url = url