2017-02-20 121 views
1

我使用Python 3和requests模块/库来查询REST服务。python3请求使用quote而不是quote_plus

看起来默认请求使用urllib.parse.quote_plus()进行urlencoding,即空格转换为+

但是,我查询的REST服务将其误解为and。所以我需要将空格编码为%20,即使用urllib.parse.quote()代替。

有没有一种简单的方法来处理请求?我在文档中找不到任何选项。

+1

您可以在将它传递到请求之前使用'urllib.parse.quote()'尝试对URL进行编码。由于它已经被编码,所以请求不会尝试进一步的格式化。 – Neelik

+0

谢谢,这个作品。但是,我可以只使用request/urllib3来做到这一点,并避免加载另一个模块(urllib)? – absurd

回答

3

原来你可以!

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方法大约在页面的一半处。

+0

谢谢。你是对的,但是这样我就放弃了只需要将一个字典作为'params'添加到requests.get(url,params = dict)的好的请求功能,因为requote_uri显然需要整个url。用Urllib代替,你可以处理一个字典:'urllib.parse.urlencode(dict,safe ='/',quote_via = urllib.parse.quote)''。那是对的吗? – absurd

+1

这是正确的。请求库在内部使用'urllib.parse.urlencode()','quote_via'参数设置为'quote_plus'。我一直在研究是否有办法通过'requests.get()'通过管道传递这个选项,看起来这是不可能的。几年前,我发现[这个问题的线索](https://github.com/kennethreitz/requests/issues/369),导致我相信,由于他们处理百分比的困难,他们最终选择了quote_plus路由。 (虽然这可以被认为是一个巨大的飞跃) – Neelik

+2

谢谢。那么,我现在正在考虑切换回urllib。 – absurd

相关问题