2016-08-24 89 views
0

舉例來說,如果我有一個編碼字符串:Python的URL編碼/解碼 - 轉換%逃脫十六進制數字轉換爲字符串

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

,對名稱參數字符%C3%A9這實際上意味着字符E 。

因此,我想輸出是:

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中的參數轉換成字典,如下所示。雖然這樣做,但我無法在我的名字參數中保留特殊字符'é'。

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

局部性=諾伍德&地址= 138 +在+遊行&區= SA &國家= AU &名=密釘+網吧& 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 +咖啡館 'u'locality ':u'Norwood',u'country':U 'AU',u'region':u'SA',u'address':u'138 + The + Parade',u'postalCode':u'5067'}

基本上...現在這個名字'Pav \ xe9 +咖啡廳'而不是所需的'Pavé'。

如何在params_dict中仍然保留相同的特殊字符?

+0

我無法重現您的錯誤。你確定你在終端和腳本中都使用相同的代碼嗎? –

+0

@machineyearning你是對的。請檢查我的編輯是否存在我的實際問題。 – activelearner

回答

0

這實際上是由於__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 Python的3個問題按照您的預期打印字符。此外,您可能需要查看urlparse來解析您的網址,而不是手動進行。

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'} 
+0

我認爲增加Python有功能來解析查詢字符串也是有用的:https://docs.python.org/3/library/urllib.parse.html#urllib.parse.parse_qs – Blender

+0

OP正在使用Python 2.6,但我會從那裏添加相關的庫。 – Karin

+0

@Karin謝謝你對__repr__和__str__的信息。理想情況下,我需要返回字典並將其保存到文件中,而不是打印。我嘗試過 - 但該文件仍然包含'Pav \ xe9 + cafe'而不是'Pavé+ cafe'。我真的不想指定使用params_dict.values()[0],params_dict.values()[1]等保存的字典值,因爲我想將整個字典保存在一個文件中。 – activelearner

相關問題