如何在Python中进行URL参数的百分号编码?
如果我这样做
url = "http://example.com?p=" + urllib.quote(query)
- 它不会把
/
转换成%2F
(这会导致OAuth的标准化出问题) - 它不支持Unicode(会抛出一个异常)
有没有更好的库可以用呢?
6 个回答
63
我觉得 requests
这个模块要好很多。它是基于 urllib3
的。
你可以试试这个:
>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
我的回答和 Paolo的回答 有点相似。
210
在Python 3中,urllib.quote
这个功能被移到了urllib.parse.quote
。而且它默认可以处理Unicode字符。
>>> from urllib.parse import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
>>> quote('/El Niño/')
'/El%20Ni%C3%B1o/'
535
来自 Python 3 文档 的内容:
urllib.parse.quote(string, safe='/', encoding=None, errors=None)
这个功能可以用
%xx
的方式来替换字符串中的特殊字符。字母、数字和字符'_.-~'
是不会被替换的。默认情况下,这个功能是用来处理 URL 的路径部分的。你可以选择一个叫做 safe 的参数,来指定一些额外的 ASCII 字符不需要被替换——默认值是'/'
。
这意味着如果把 ''
传给 safe 参数,就能解决你第一个问题:
>>> import urllib.parse
>>> urllib.parse.quote('/test')
'/test'
>>> urllib.parse.quote('/test', safe='')
'%2Ftest'
(在 Python 3 中,quote
函数从 urllib
移动到了 urllib.parse
。)
顺便提一下,可以看看 urlencode。
关于第二个问题,有一个 错误报告,这个问题在 Python 3 中已经修复了。
对于 Python 2,你可以通过将其编码为 UTF-8 来解决这个问题,方法如下:
>>> query = urllib.quote(u"Müller".encode('utf8'))
>>> print urllib.unquote(query).decode('utf8')
Müller