Python, 반대 함수 urllib.urlencode


88

처리 후 데이터 urllib.urlencode를 dict 로 변환하려면 어떻게 해야합니까? urllib.urldecode존재하지 않는다.

답변:


124

대한 문서urlencode,

urlparse 모듈은 쿼리 문자열을 Python 데이터 구조로 구문 분석하는 데 사용되는 parse_qs () 및 parse_qsl () 함수를 제공합니다.

(이전 Python 릴리스에서는 cgi모듈에 있었습니다 ). 예를 들면 다음과 같습니다.

>>> import urllib
>>> import urlparse
>>> d = {'a':'b', 'c':'d'}
>>> s = urllib.urlencode(d)
>>> s
'a=b&c=d'
>>> d1 = urlparse.parse_qs(s)
>>> d1
{'a': ['b'], 'c': ['d']}

원래 사전 d과 "왕복" 사전의 명백한 차이점 d1은 후자는 (이 경우 단일 항목) 목록 을 값으로 가지고 있다는 것입니다. 이는 쿼리 문자열에 고유성 보장이 없기 때문이며 중요 할 수 있습니다. 앱에 각 키에 대해 제공된 여러 값에 대해 알 수 있습니다 (즉, 목록이 항상 단일 항목이되는 것은 아닙니다 .-).

대안으로 :

>>> sq = urlparse.parse_qsl(s)
>>> sq  
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}

일련의 쌍을 얻을 수 있습니다 (urlencode는 그러한 인수도 허용합니다-이 경우 순서를 유지하고 dict의 경우 보존 할 순서가 없습니다 ;-). 중복 된 "키"가 없다는 것을 알고 있거나 존재하는지 상관하지 않는 경우 (내가 보여 드린대로) dict목록이 아닌 값을 가진 사전을 가져 오기 위해 호출 할 수 있습니다 . 그러나 일반적으로 중복 있는 경우 수행 할 작업을 고려해야합니다 (Python은 사용자를 대신하여 결정하지 않습니다 .-) .


1
매우 철저한 답변입니다. 대박!
Hartley Brody 2011

1
Python 2에 대한 찬성 투표, 그러나 Python 3은 모두 urllib모듈에 있습니다. @phobie 답변을 참조하십시오.
openwonk

19

Alex의 솔루션을위한 Python 3 코드 :

>>> import urllib.parse
>>> d = {'a':'b', 'c':'d'}
>>> s = urllib.parse.urlencode(d)
>>> s
'a=b&c=d'
>>> d1 = urllib.parse.parse_qs(s)
>>> d1
{'a': ['b'], 'c': ['d']}

대안 :

>>> sq = urllib.parse.parse_qsl(s)
>>> sq
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}

parse_qsl은 되돌릴 수 있습니다.

>>> urllib.parse.urlencode(sq)
'a=b&c=d'

16

urllib.unquote_plus()당신이 원하는 것을합니다. % xx 이스케이프를 해당 단일 문자로 대체하고 더하기 기호를 공백으로 바꿉니다.

예:

unquote_plus('/%7Ecandidates/?name=john+connolly') 

수확량

'/~candidates/?name=john connolly'.

2
그는 사전을 원한다고 말했습니다. 그래서 당신의 대답은 틀 렸습니다.
balrok

4
예, 이것이 제가 찾던 것입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.