如何在Python中进行URL参数的百分号编码?

416 投票
6 回答
370533 浏览
提问于 2025-04-15 15:46

如果我这样做

url = "http://example.com?p=" + urllib.quote(query)
  1. 它不会把 / 转换成 %2F(这会导致OAuth的标准化出问题)
  2. 它不支持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

撰写回答