python3请求使用quote而不是quote_plus
我使用Python 3和requests模块/库来查询REST服务。python3请求使用quote而不是quote_plus
看起来默认请求使用urllib.parse.quote_plus()
进行urlencoding,即空格转换为+
。
但是,我查询的REST服务将其误解为and
。所以我需要将空格编码为%20
,即使用urllib.parse.quote()
代替。
有没有一种简单的方法来处理请求?我在文档中找不到任何选项。
原来你可以!
from requests.utils import requote_uri
url = "https://www.somerandom.com/?name=Something Cool"
requote_uri(url)
'https://www.somerandom.com/?name=Something%20Cool'
documentation here requote_uri方法大约在页面的一半处。
谢谢。你是对的,但是这样我就放弃了只需要将一个字典作为'params'添加到requests.get(url,params = dict)的好的请求功能,因为requote_uri显然需要整个url。用Urllib代替,你可以处理一个字典:'urllib.parse.urlencode(dict,safe ='/',quote_via = urllib.parse.quote)''。那是对的吗? – absurd
这是正确的。请求库在内部使用'urllib.parse.urlencode()','quote_via'参数设置为'quote_plus'。我一直在研究是否有办法通过'requests.get()'通过管道传递这个选项,看起来这是不可能的。几年前,我发现[这个问题的线索](https://github.com/kennethreitz/requests/issues/369),导致我相信,由于他们处理百分比的困难,他们最终选择了quote_plus路由。 (虽然这可以被认为是一个巨大的飞跃) – Neelik
谢谢。那么,我现在正在考虑切换回urllib。 – absurd
您可以在将它传递到请求之前使用'urllib.parse.quote()'尝试对URL进行编码。由于它已经被编码,所以请求不会尝试进一步的格式化。 – Neelik
谢谢,这个作品。但是,我可以只使用request/urllib3来做到这一点,并避免加载另一个模块(urllib)? – absurd