将params参数中的值解析为包含句点的request.get()

时间:2012-11-30 21:06:49

标签: python url python-requests

我正在使用python包请求向服务器发出get请求。我的目标是复制某些已知的http请求并将它们合并到我的python脚本中。原始查询字符串包含一个键值对'version = 0%2E12',我知道它是url编码的等效'version = 0.12'。下面是我正在做的复制http请求的示例。

params = {
          'version'='0.12',
          'language'='en',
          ...
          }
 resp = requests.get(url, params)

生成的url查询字符串中包含“version = 0.12”。如果我尝试将params的设置更改为以下内容,

    params = {
          'version'='0%2E12',
          'language'='en',
          ...
          }

但结果查询字符串包含'version = 0%252E31'。实质上,请求是将%解析为url编码。

如何在没有手动编写整个网址的情况下正确解析我的params参数请求?

1 个答案:

答案 0 :(得分:2)

请注意,.是网址编码值中完全有效的字符。

您需要自行编码值,绕过标准编码。我使用urllib.urlencode(),然后手动将.字符替换为%2E

然后,您必须将编码的字符串作为查询参数附加到URL,并将requests配置为不重新编码值:

params = {
      'version'='0.12',
      'language'='en',
      ...
      }
params = urllib.urlencode(params)
params = params.replace('.', '%2E')
resp = requests.get('?'.join(url, params), config={'encode_uri': False})

设置为encode_uri的{​​{1}}参数可以解决问题;这是requests default,否则将重新编码整个URL以确保RFC合规性。