繁体   English   中英

Python url编码/解码-将%转义的十六进制数字转换为字符串

[英]Python url encode/decode - Convert % escaped hexadecimal digits into string

例如,如果我有一个编码字符串为:

url='locality=Norwood&address=138+The+Parade&region=SA&country=AU&name=Pav%C3%A9+cafe&postalCode=5067'

name参数的字符为%C3%A9,实际上表示字符é。

因此,我希望输出为:

new_url='locality=Norwood&address=138+The+Parade&region=SA&country=AU&name=Pavé+cafe&postalCode=5067'

我在Python终端上尝试了以下步骤:

>>> import urllib2
>>> url='locality=Norwood&address=138+The+Parade&region=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&region=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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM