python中的URL编码

Posted

技术标签:

【中文标题】python中的URL编码【英文标题】:URL encoding in python 【发布时间】:2012-02-12 22:05:14 【问题描述】:

我在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

【问题讨论】:

【参考方案1】:

对于 Python 2.x,请使用 urllib.quote

使用 %xx 转义符替换字符串中的特殊字符。从不引用字母、数字和字符“_.-”。默认情况下,此函数用于引用 URL 的路径部分。可选的安全参数指定不应被引用的附加字符——它的默认值为'/'。

示例:

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'

【讨论】:

或urllib.quote_plus,因为OP想要+而不是%20 但要获得 OP 的要求,请使用 urllib.quote_plus 我相信,对于 Python 3.*,你应该使用import urllib.parse ... urllib.parse.quote ...from urllib import parse ... parse.quote ... 而不是import urllib ... urllib.parse.quote ...,这将导致AttributeError: module 'urllib' has no attribute 'parse',类似于imports in werkzeug。在 Python 3.6.1 上测试。【参考方案2】:

请记住,如果输入是 unicode 字符串,urllib.quote 和 urllib.quote_plus 都会引发错误:

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'

正如here on SO 的回答,必须明确使用“UTF-8”:

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

【讨论】:

【参考方案3】:

另外,如果您有多个值的字典,最好的方法是urllib.urlencode

【讨论】:

以上是关于python中的URL编码的主要内容,如果未能解决你的问题,请参考以下文章

Python中的url编码问题

python3解决url编码与解码

使用python进行URL编码,爬虫时解决参数乱码的问题

python--url编码/解码

URL地址编码和解码

Python进阶篇四Python爬虫的URL编码/解码