처리 후 데이터 urllib.urlencode
를 dict 로 변환하려면 어떻게 해야합니까?
urllib.urldecode
존재하지 않는다.
답변
에 대한 문서 로 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은 사용자를 대신하여 결정하지 않습니다 .-) .
답변
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'
답변
urllib.unquote_plus()
당신이 원하는 것을합니다. % xx 이스케이프를 해당 단일 문자로 대체하고 더하기 기호를 공백으로 바꿉니다.
예:
unquote_plus('/%7Ecandidates/?name=john+connolly')
수확량
'/~candidates/?name=john connolly'.