Konwertuj obiekt mapowania lub sekwencję krotek dwuelementowych, które mogą zawierać obiekty str lub bajty, na ciąg tekstowy ASCII zakodowany w procentach.
To prawda, ale dictzwracane przez cgi.parse_qs()faktycznie ma lists jako swoje „wartości”. Przekazywanie ich bezpośrednio spowoduje powstanie bardzo dziwnie wyglądających ciągów zapytań.
Johnsyweb
To prawda. To nauczy mnie czytać więcej niż pierwsze zdanie!
Szukasz czegoś dokładnie takiego urllib.urlencode()!
Jednak w przypadku wywołania parse_qs()(odróżnienia od parse_qsl()) klucze słownika są unikatowymi nazwami zmiennych zapytania, a wartości są listami wartości dla każdej nazwy.
Aby przekazać te informacje do urllib.urlencode(), musisz „spłaszczyć” te listy. Oto, jak możesz to zrobić za pomocą listy obejmującej krotki:
query_pairs =[(k,v)for k,vlist in d.iteritems()for v in vlist]
urllib.urlencode(query_pairs)
Pobiera słownik i konwertuje go na ciąg zapytania, podobnie jak urlencode. Doda końcowe „&” do ciągu zapytania, ale return query[:-1]naprawia to, jeśli jest to problem.
Czy już się spotkałeś str.join()? A co powiesz urllib.quote_plus()?
Ignacio Vazquez-Abrams
1
@garbados Twoje rozwiązanie powinno działać w prostych przypadkach. Jednak spojrzeć urlencodew urllib.py(powinien by w Pythonie zainstalować), aby zobaczyć, dlaczego tworząc łańcuch zapytania czasami nie jest tak proste, jak sugeruje odpowiedź (w szczególności potrzebę „cytat” pewne znaki, które nie są ważne w URL). @Ignacio odwołał się również do dwóch funkcji, które oczyściłyby twoją implementację i poprawiły ją.
Anthony Cramp
Ach, rzeczywiście. Przepraszamy za prymitywną implementację. Pokazuje, że powinienem być bardziej ostrożny, odpowiadając na pytania, z którymi sam nigdy się nie spotkałem.
garbados
Chociaż może to nie być najlepsza odpowiedź, dokładnie to chciałem zobaczyć, klikając tytuł tego pytania. Mam tylko 4 elementy w dictwie, które muszę zamienić w parę nazwa = wartość oddzieloną znakiem „&”. Moje wartości są kontrolowane. Str.join () jest przydatna w moim przypadku, ale znowu nie potrzebuję quote_plus (), ponieważ nie jest to kod dostępny publicznie :) Dzięki!
harperville,
1
@harperville, ale bardziej poprawny sposób ( from urllib.parse import urlencode; urlencode(your_dict)) jest krótszy i łatwiejszy niż ten! Przyznam, że czasem mądrze jest wymyślić na nowo koło, nawet tandetnie, gdy dostęp do istniejących, dobrze zaprojektowanych kół jest drogi lub niewygodny, ale tutaj użycie gotowego koła jest łatwiejsze i szybsze niż toczenie własnego, gorszego .
cgi.parse_qs()
jest przestarzała. Zamiast tego użyj urlparse.parse_qs ().Odpowiedzi:
Python 3
A
dict
to odwzorowanie.Starsza wersja Pythona
źródło
dict
zwracane przezcgi.parse_qs()
faktycznie malist
s jako swoje „wartości”. Przekazywanie ich bezpośrednio spowoduje powstanie bardzo dziwnie wyglądających ciągów zapytań.W python3 nieco inaczej:
wynik:
'pram1=foo¶m2=bar'
aby uzyskać zgodność z python2 i python3, wypróbuj to:
źródło
Szukasz czegoś dokładnie takiego
urllib.urlencode()
!Jednak w przypadku wywołania
parse_qs()
(odróżnienia odparse_qsl()
) klucze słownika są unikatowymi nazwami zmiennych zapytania, a wartości są listami wartości dla każdej nazwy.Aby przekazać te informacje do
urllib.urlencode()
, musisz „spłaszczyć” te listy. Oto, jak możesz to zrobić za pomocą listy obejmującej krotki:źródło
doseq=True
.Może szukasz czegoś takiego:
Pobiera słownik i konwertuje go na ciąg zapytania, podobnie jak urlencode. Doda końcowe „&” do ciągu zapytania, ale
return query[:-1]
naprawia to, jeśli jest to problem.źródło
str.join()
? A co powieszurllib.quote_plus()
?urlencode
wurllib.py
(powinien by w Pythonie zainstalować), aby zobaczyć, dlaczego tworząc łańcuch zapytania czasami nie jest tak proste, jak sugeruje odpowiedź (w szczególności potrzebę „cytat” pewne znaki, które nie są ważne w URL). @Ignacio odwołał się również do dwóch funkcji, które oczyściłyby twoją implementację i poprawiły ją.from urllib.parse import urlencode; urlencode(your_dict)
) jest krótszy i łatwiejszy niż ten! Przyznam, że czasem mądrze jest wymyślić na nowo koło, nawet tandetnie, gdy dostęp do istniejących, dobrze zaprojektowanych kół jest drogi lub niewygodny, ale tutaj użycie gotowego koła jest łatwiejsze i szybsze niż toczenie własnego, gorszego .