Jak mogę przekonwertować dane po przetworzeniu urllib.urlencode
na dyktowanie?
urllib.urldecode
nie istnieje.
Odpowiedzi:
Jak docs do urlencode
powiedzenia,
Moduł urlparse udostępnia funkcje parse_qs () i parse_qsl (), które są używane do analizowania ciągów zapytań w struktury danych Pythona.
(W starszych wersjach Pythona znajdowały się w cgi
module). Na przykład:
>>> 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']}
Oczywistą różnicą między oryginalnym słownikiem d
a słownikiem „w obie strony” d1
jest to, że ten drugi ma (w tym przypadku pojedynczy element) listy jako wartości - to dlatego, że nie ma gwarancji unikalności w ciągach zapytań i może to być ważne do swojej aplikacji, aby dowiedzieć się, jakie wartości zostały podane dla każdego klucza (to znaczy, że listy nie zawsze będą zawierały pojedyncze pozycje ;-).
Jako alternatywa:
>>> sq = urlparse.parse_qsl(s)
>>> sq
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}
można uzyskać ciąg par (urlencode też akceptuje taki argument - w tym przypadku zachowuje porządek, podczas gdy w przypadku dyktowania nie ma porządku do zachowania ;-). Jeśli wiesz, że nie ma zduplikowanych „kluczy” lub nie obchodzi cię, czy istnieją, to (jak pokazałem) możesz wywołać dict
słownik z wartościami spoza listy. Ogólnie jednak musisz zastanowić się, co chcesz zrobić, jeśli istnieją duplikaty (Python nie decyduje o tym w Twoim imieniu ;-).
urllib
module. Zobacz odpowiedź @phobie.
Kod Python 3 dla rozwiązania Alexa:
>>> 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']}
Alternatywa:
>>> sq = urllib.parse.parse_qsl(s)
>>> sq
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}
parse_qsl jest odwracalne:
>>> urllib.parse.urlencode(sq)
'a=b&c=d'
urllib.unquote_plus()
robi co chcesz. Zastępuje znaki ucieczki% xx ich jednoznakowym odpowiednikiem i zastępuje znaki plus spacjami.
Przykład:
unquote_plus('/%7Ecandidates/?name=john+connolly')
plony
'/~candidates/?name=john connolly'.