59

我正在尝试在 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)

有没有办法以原始形式传递参数 - 没有百分比编码?

谢谢!

4

6 回答 6

71

这不是一个好的解决方案,但您可以直接使用string

r = requests.get(url, params='format=json&key=site:dummy+type:example+group:wheel')

顺便提一句:

转换payload为此字符串的代码

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)

编辑(2020):

您还可以使用urllib.parse.urlencode(...)with 参数safe=':+'创建字符串而不转换 chars :+

据我所知,requestsurllib.parse.urlencode(...)用于此,但没有safe=.

import requests
import urllib.parse

payload = {
    'format': 'json', 
    'key': 'site:dummy+type:example+group:wheel'
}

payload_str = urllib.parse.urlencode(payload, safe=':+')
# 'format=json&key=site:dummy+type:example+group:wheel'

url = 'https://httpbin.org/get'

r = requests.get(url, params=payload_str)

print(r.text)

我使用页面https://httpbin.org/get来测试它。

于 2014-05-06T14:44:33.923 回答
13

按照设计,解决方案是直接传递 URL。

于 2014-05-06T14:44:18.093 回答
13

万一其他人将来遇到这种情况,您可以将 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.parse.quote(","), ",")
        return requests.Session.send(self, *a, **kw)

s = NoQuotedCommasSession()
s.get("http://somesite.com/an,url,with,commas,that,won't,be,encoded.")
于 2016-11-17T13:11:57.867 回答
8

上面的答案对我不起作用。

我试图做一个参数包含管道的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'
于 2017-03-17T16:43:53.423 回答
0

从请求版本 2.26 开始,上述所有解决方案似乎都不再起作用。来自 GitHub 存储库的建议解决方案似乎正在使用 PreparedRequest 的变通方法。

以下对我有用。确保 URL 是可解析的,所以不要使用“this-is-not-a-domain.com”。

import requests

base_url = 'https://www.example.com/search'
query = '?format=json&key=site:dummy+type:example+group:wheel'

s = requests.Session()
req = requests.Request('GET', base_url)
p = req.prepare()
p.url += query
resp = s.send(p)
print(resp.request.url)

来源:https ://github.com/psf/requests/issues/5964#issuecomment-949013046

于 2022-01-07T13:38:04.697 回答
0

请查看此github 链接中的第一个选项。你可以忽略urlib这意味着prep.url = url而不是prep.url = url + qry

于 2018-05-10T15:00:06.383 回答