[英]Python url encode/decode - Convert % escaped hexadecimal digits into string
例如,如果我有一个编码字符串为:
url='locality=Norwood&address=138+The+Parade®ion=SA&country=AU&name=Pav%C3%A9+cafe&postalCode=5067'
name参数的字符为%C3%A9,实际上表示字符é。
因此,我希望输出为:
new_url='locality=Norwood&address=138+The+Parade®ion=SA&country=AU&name=Pavé+cafe&postalCode=5067'
我在Python终端上尝试了以下步骤:
>>> import urllib2
>>> url='locality=Norwood&address=138+The+Parade®ion=SA&country=AU&name=Pav%C3%A9+cafe&postalCode=5067'
>>> new_url=urllib2.unquote(url).decode('utf8')
>>> print new_url
locality=Norwood&address=138+The+Parade®ion=SA&country=AU&name=Pavé+cafe&postalCode=5067
>>>
但是,当我在Python脚本中尝试相同的操作并作为myscript.py运行时,我得到了以下堆栈跟踪:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 88: ordinal not in range(128)
我正在使用Python 2.6.6,由于工作原因,无法切换到其他版本。
我该如何克服这个错误?
任何帮助是极大的赞赏。 提前致谢!
######################################################
编辑
我意识到我得到了上述预期的输出。
但是 ,我想将new_url中的参数转换为字典,如下所示。 这样做时,我无法在我的name参数中保留特殊字符'é'。
print new_url
params_list = new_url.split("&")
print(params_list)
params_dict={}
for p in params_list:
temp = p.split("=")
params_dict[temp[0]] = temp[1]
print(params_dict)
输出:
new_url
locality = Norwood&address = 138 + The + Parade&region = SA&country = AU&name =Pavé+ cafe&postalCode = 5067
params_list
[u'locality = Norwood',u'address = 138 + The + Parade',u'region = SA',u'country = AU',u'name = Pav \\ xe9 + cafe',u'postalCode = 5067' ]
params_dict
{u'name':u'Pav \\ xe9 + cafe',u'locality':u'Norwood',u'country':u'AU',u'region':u'SA',u'address': u'138 + The + Parade',u'postalCode':u'5067'}
基本上...现在的名称是'Pav \\ xe9 + cafe',而不是必需的'Pavé'。
如何在params_dict中仍然保留相同的特殊字符?
这实际上是由于__repr__
和__str__
之间的差异。 当打印unicode字符串时,使用__str__
并得到在打印new_url
时看到的é
。 然而,当打印的列表或字典时, __repr__
被使用,其使用__repr__
列表和类型的字典中的每个对象。 如果您分别打印项目,则它们将按您的要求进行打印。
# -*- coding: utf-8 -*-
new_url = u'name=Pavé+cafe&postalCode=5067'
print(new_url) # name=Pavé+cafe&postalCode=5067
params_list = [s for s in new_url.split("&")]
print(params_list) # [u'name=Pav\xe9+cafe', u'postalCode=5067']
print(params_list[0]) # name=Pavé+cafe
print(params_list[1]) # postalCode=5067
params_dict = {}
for p in params_list:
temp = p.split("=")
params_dict[temp[0]] = temp[1]
print(params_dict) # {u'postalCode': u'5067', u'name': u'Pav\xe9+cafe'}
print(params_dict.values()[0]) # 5067
print(params_dict.values()[1]) # Pavé+cafe
打印列表和字典的一种方法是获取它们的字符串表示形式,然后使用unicode-escape
对其进行解码:
print(str(params_list).decode('unicode-escape')) # [u'name=Pavé+cafe', u'postalCode=5067']
print(str(params_dict).decode('unicode-escape')) # {u'postalCode': u'5067', u'name': u'Pavé+cafe'}
注意 :这只是Python 2中的问题。Python3会按您期望的那样打印字符。 另外,您可能希望使用urlparse
来解析URL,而不是手动执行。
import urlparse
new_url = u'name=Pavé+cafe&postalCode=5067'
print dict(urlparse.parse_qsl(new_url)) # {u'postalCode': u'5067', u'name': u'Pav\xe9 cafe'}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.