为什么+
未转换为空格:
>>> import urllib
>>> url = 'Q=Who+am+I%3F'
>>> urllib.unquote(url)
'Q=Who+am+I?'
>>>
答案 0 :(得分:4)
有两种变体; urllib.unqoute()
和urllib.unquote_plus()
。使用后者:
>>> import urllib
>>> url = 'Q=Who+am+I%3F'
>>> urllib.unquote_plus(url)
'Q=Who am I?'
那是因为有两种URL引用变体;一个用于URL路径段,另一个用于URL查询参数;后者使用不同的规范。见Wikipedia:
当提交已输入HTML表单的数据时,表单字段名称和值将被编码并使用方法GET或POST在HTTP请求消息中发送到服务器,或者历史上通过电子邮件发送到服务器。默认情况下使用的编码基于一般URI百分比编码规则的早期版本,并进行了许多修改,例如换行标准化和用
"+"
代替"%20"
替换空格。
所以在GET或POST请求中使用application/x-www-form-urlencoded
mime类型的表单使用稍微不同的规则,其中一个空格被编码为+
,但是当编码字符时使用了网址%20
。解码时,您需要选择正确的变体。您有表单数据(来自URL的查询部分),因此您需要使用unquote_plus()
。
现在,如果要解析查询字符串,可能需要使用urlparse.parse_qs()
或urlparse.parse_qsl()
函数;这些不仅会使用正确的unquote*()
函数,还会将参数解析为字典或键值对列表:
>>> import urlparse
>>> urlparse.parse_qs(url)
{'Q': ['Who am I?']}
>>> urlparse.parse_qsl(url)
[('Q', 'Who am I?')]