Python中的URL编码

28 投票
3 回答
66264 浏览
提问于 2025-04-17 10:30

我是不是漏掉了什么简单的方法,在urllib或者其他库里可以完成这个任务?URL编码是把不安全的ASCII字符替换成一个“%”符号,后面跟着两个十六进制数字。

这里有一个输入的例子和我期望的输出:

Mozilla/5.0 (Linux; U; Android 4.0; xx-xx; Galaxy Nexus Build/IFL10C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30

Mozilla%2F5.0+%28Linux%3B+U%3B+Android+4.0%3B+xx-xx%3B+Galaxy+Nexus+Build%2FIFL10C%29+AppleWebKit%2F534.30+%28KHTML%2C+like+Gecko%29+Version%2F4.0+Mobile+Safari%2F534.30

3 个回答

1

另外,如果你有一个包含多个值的字典,最好的做法是使用 urllib.urlencode

3

请注意,urllib.quoteurllib.quote_plus 这两个函数在输入是 Unicode 字符串时会报错:

s = u'\u2013'
urllib.quote(s)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\urllib.py", line 1303, in quote
    return ''.join(map(quoter, s))
KeyError: u'\u2013'

正如在这里的回答中提到的,必须明确使用 'UTF-8' 编码:

urllib.quote(s.encode('utf-8'))
53

对于 Python 2.x,你可以使用 urllib.quote

这个方法可以用来替换字符串中的特殊字符,使用的是 %xx 的方式来表示。字母、数字和字符 '_.-' 是不会被替换的。默认情况下,这个函数是用来处理 URL 的路径部分的。你还可以使用一个可选的 safe 参数,来指定一些额外的字符不需要被替换,默认值是 '/'。

举个例子:

In [1]: import urllib

In [2]: urllib.quote('%')
Out[2]: '%25'

编辑:

在你的情况下,如果想把空格替换成加号,你可以使用 urllib.quote_plus

举个例子:

In [4]: urllib.quote_plus('a b')
Out[4]: 'a+b'

对于 Python 3.x,你可以使用 quote

>>> import urllib
>>> a = "asdas#@das"
>>> urllib.parse.quote(a)
'asdas%23%40das'

如果字符串中有空格,可以使用 quote_plus

>>> import urllib
>>> a = "as da& s#@das"
>>> urllib.parse.quote_plus(a)
'as+da%26+s%23%40das'

撰写回答