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编码的主要内容,如果未能解决你的问题,请参考以下文章