Python请求:具有百分比字符的URL

时间:2016-10-21 07:38:08

标签: python url python-requests percent-encoding

我一直在寻找这个地方,但我无法解决我的问题。

我使用本地API来获取某些数据,在该API中,通配符是字符%%

网址如下:urlReq = 'http://myApiURL?ID=something&parameter=%w42'

然后我将它传递给get函数:

req = requests.get(urlReq,auth=HTTPBasicAuth(user, pass))

并收到以下错误:InvalidURL: Invalid percent-escape sequence: 'w4'

我尝试使用%转义%%字符,但徒劳无功。我也尝试了以下内容:

urlReq = 'http://myApiURL?ID=something&parameter=%sw42' % '%'但效果不佳。

有谁知道如何解决这个问题?

PS我正在使用 Python 2.7.8 :: Anaconda 1.9.1(64位)

4 个答案:

答案 0 :(得分:4)

你应该看看urllib.quote - 应该这样做。请查看docs以供参考。

要扩展此答案:问题是,%(+十六进制数字)是网址中特殊字符的escape sequence。如果您希望服务器明确地解释您的%,您也需要将其转义,这可以通过将其替换为%25来完成。前面提到的qoute函数为你做了类似的事情。

答案 1 :(得分:3)

requests通过将params参数中的参数传递给requests.get()see documentation)来为您构造查询字符串:

api_url = 'http://myApiURL'
params = {'ID': 'something', 'parameter': '%w42'}
r = requests.get(api_url, params=params, auth=(user, pass))
然后

requests应该对查询字符串中的参数进行百分比编码。话虽如此,至少在我的机器上使用requests版本2.11.1,我发现%在网址中传递时会被编码,所以也许您可以查看您正在使用的版本。

同样,对于基本身份验证,您只需在元组中传递用户名和密码,如上所示。

答案 2 :(得分:1)

requests

您应该使用requests.compat.quote_plus这里的take alook

示例:

>>> requests.compat.quote_plus('example: parameter=%w42')
'example%3A+parameter%3D%25w42'

答案 3 :(得分:0)

致@Tryph的信用:

%用于编码网址中的特殊字符。您可以使用此序列%25对%字符进行编码。有关详细信息,请参阅此处:w3schools.com/tags/ref_urlencode.asp