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

时间:2019-06-23 08:16:56

标签: python urllib urlencode

我有一个字典,想使用urlencode作为查询参数。 我要访问的服务器希望查询看起来像这样:http://www.example.com?A=B,C

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

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

有什么办法可以使逗号转义,使urlencode像普通字符一样对待?

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

2 个答案:

答案 0 :(得分: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

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

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

这不容易解决,因为某些Web服务使用,,而另一些使用%2C,但这两个都不是错误的。您可能只需要自己处理这种编码。

答案 1 :(得分:-1)

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

urllib.quote(str, safe='~()*!.\'')

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