2016-08-24 2 views
0

예를 들어, 나는 같은 인코딩 된 문자열이있는 경우 : 이름 매개 변수가 실제로 문자 é를 함축 문자 %의 C3의 %의 A9를 가지고파이썬의 URL 인 코드/디코드 - % 문자열로 16 진수를 탈출 변환

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

을 .

따라서, 나는 것으로 출력을 싶습니다 그러나

>>> 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 
>>> 

, 나는 내에서 같은 일을 시도 :

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

가 나는 파이썬 터미널에서 다음 단계를 시도 파이썬 스크립트 그리고 myscript.py로 실행하면 다음 스택 추적을 얻게됩니다.

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 88: ordinal not in range(128) 

저는 파이썬 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 ' = 5067 u'postalCode ']

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 + cafe'(필수 'Pavé'와 반대).

params_dict에서 같은 특수 문자를 계속 유지하려면 어떻게해야합니까?

+0

오류를 재현하지 못했습니다. 터미널과 스크립트에서 동일한 코드를 사용하고 있습니까? –

+0

@ machineyearning 정확합니다. 내 실제 문제에 대한 편집을 확인하십시오. – activelearner

답변

0

실제로 이는 __repr____str__의 차이 때문입니다. 유니 코드 문자열을 인쇄 할 때 __str__이 사용되고 new_url을 인쇄 할 때 é이 표시됩니다. 그러나 목록 또는 dict 인쇄 할 때 __repr__ 사용되며 __repr__ 목록 및 dicts 내의 각 개체에 대해 사용합니다. 항목을 별도로 인쇄하면 원하는대로 인쇄됩니다.

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

: 목록 및 DICT를 인쇄 할 수

# -*- 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로 디코딩 한 후, 자신의 캐릭터 라인 표현을 얻는 것입니다 이것은 파이썬 2. 파이썬 3 만 문제입니다 예상대로 문자를 인쇄합니다. 또한 수동으로 수행하는 대신 URL을 구문 분석하기 위해 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

파이썬에 이미 쿼리 문자열을 구문 분석하는 함수가 있다는 것을 추가하는 것이 유용 할 것이라고 생각합니다. https://docs.python.org/3/library/urllib.parse.html#urllib.parse.parse_qs – Blender

+0

OP를 사용하고 있습니다. 파이썬 2.6,하지만 거기에서 관련 라이브러리를 추가 할 것입니다. – Karin

+0

@ 카린 __repr__ 및 __str__에 대한 정보를 제공해 주셔서 감사합니다. 인쇄하는 대신 이상적으로 사전을 반환하고 파일에 저장해야합니다. 나는 이것을 시도했다 - 그러나 파일에는 여전히 'Pavé + 카페'대신 'Pav \ xe9 + cafe'가 포함되어있다. 그리고 나는 전체 사전을 파일에 저장하려고하기 때문에 params_dict.values ​​() [0], params_dict.values ​​() [1] 등을 사용하여 저장할 값을 지정하고 싶지 않습니다 ... – activelearner

관련 문제