使用 python 的 urllib.urlencode() 时如何转义某些字符?

Saq*_*Ali 5 python urllib urlencode

我有一本字典,我想将其编码为查询参数。我正在访问的服务器期望查询如下所示:http://www.example.com?A=B,C

但是当我尝试使用urllib.urlencode构建 URL 时,我发现逗号变成了%2C

>>> import urllib
>>> urllib.urlencode({"A":"B,C"})
'A=B%2CC'
Run Code Online (Sandbox Code Playgroud)

有什么方法可以转义逗号,以便urlencode将其视为普通字符吗?

如果没有,我该如何解决这个问题?

Vip*_*shi 5

您可以通过将某些字符显式指定为安全参数值来转义它们

urllib.quote(str, safe='~()*!.\'')
Run Code Online (Sandbox Code Playgroud)

更多:https ://docs.python.org/3.0/library/urllib.parse.html#urllib.parse.quote

  • 不好的是,在 Py2 中编码字典时无法转义字符,尽管您可以使用丑陋的 hack `str.replace("%2C",",")` 但是在 Py3 中,`urllib.parse.urlencode({"hello ":"w,b"},安全=",")` (2认同)

Par*_*007 1

query params您可以通过在到达端点之前添加 作为字符串来完成此操作。

我曾用于requests提出请求。

例如:

GET Request

import requests

url = "https://www.example.com/?"
query = "A=B,C"

url_final = url + query

url  = requests.get(url_final)

print(url.url)
# https://www.example.com/?A=B,C

Run Code Online (Sandbox Code Playgroud)

逗号(以及一些其他字符)在RFC 3986中被定义为保留字符。这意味着逗号在 URL 的各个部分都有定义的含义,如果不在该上下文中使用它,则需要对其进行百分比编码。

也就是说,查询参数没有为逗号提供任何特殊语法,因此在查询参数中,我们可能不应该对其进行编码。也就是说,这并不完全是 Requests 的错:参数是使用 进行编码的urllib.urlencode(),这就是对查询参数进行百分比编码。

但这并不容易解决,因为有些 Web 服务使用,,有些使用%2C,而且两者都没有错。您可能只需要自己处理此编码。