【问题标题】:Parsing values in params argument to request.get() which contain periods解析包含句点的 request.get() 的 params 参数中的值
【发布时间】:2012-11-30 21:06:49
【问题描述】:

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

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

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

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

但生成的查询字符串包含“版本=0%252E31”。本质上,请求是解析 % 以进行 url 编码。

如何在不手动编写整个 url 的情况下获得正确解析带有句点的 params 参数的请求?

【问题讨论】:

  • . 是 URL 编码值中完全有效的字符。为什么您必须对其进行编码?
  • 原始查询字符串包含 %2E 字符,我想减少因使我的请求不同而可能出现的任何错误。
  • 实际错误吗?
  • 是的。服务器发回 200 响应代码,但返回正文包含错误。

标签: python url python-requests


【解决方案1】:

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

您需要自己编码值,绕过标准编码。我会使用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})

设置为Falseencode_uri 参数在这里起到了作用;就是 requests default 否则将重新编码整个 URL 以确保 RFC 合规性。

【讨论】:

  • 当我尝试实施您的解决方案时,我得到了一个有趣的结果。就在 request.get() 调用参数具有正确的 '%2E' 之前,但是一旦我在 Fiddler2 中看到请求通过,我就会看到它改回了 '.'。您知道查询字符串中有句点是否有问题吗?
  • 也许吧,但是原始 http 请求(也在 Fiddler2 中查看)具有 %2E 编码。
  • @JonathanV:找到了;我用调试器运行了代码,requests 确实重新编码了完整的 URL。不过,有一个开关,添加到答案中。
  • 这不适用于 1.04 版的请求模块我得到 request() 得到了一个意外的关键字参数 'config' 关于如何解决这个问题的任何想法?
  • @user1582112:Requests 1.0x 被大量重构。它很可能打破了这种方法,是的。 可能它现在根本不重新编码。
猜你喜欢
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 2021-03-20
  • 1970-01-01
  • 2014-07-26
相关资源
最近更新 更多