Po użyciu cgi.parse_qs()
, jak przekonwertować wynik (słownik) z powrotem na ciąg zapytania? Szukasz czegoś podobnego do urllib.urlencode()
.
Po użyciu cgi.parse_qs()
, jak przekonwertować wynik (słownik) z powrotem na ciąg zapytania? Szukasz czegoś podobnego do urllib.urlencode()
.
Odpowiedzi:
urllib.parse.
urlencode
(zapytanie, dawkaq = False, [...])Konwertuj obiekt mapowania lub sekwencję krotek dwuelementowych, które mogą zawierać obiekty str lub bajty, na ciąg tekstowy ASCII zakodowany w procentach.
A dict
to odwzorowanie.
urllib.urlencode
(query
[,doseq
])
Konwertuj obiekt mapujący lub sekwencję krotek dwuelementowych na łańcuch „zakodowany w procentach” ... ciągkey=value
par oddzielonych'&'
znakami ...
dict
zwracane przez cgi.parse_qs()
faktycznie ma list
s jako swoje „wartości”. Przekazywanie ich bezpośrednio spowoduje powstanie bardzo dziwnie wyglądających ciągów zapytań.
W python3 nieco inaczej:
from urllib.parse import urlencode
urlencode({'pram1': 'foo', 'param2': 'bar'})
wynik: 'pram1=foo¶m2=bar'
aby uzyskać zgodność z python2 i python3, wypróbuj to:
try:
#python2
from urllib import urlencode
except ImportError:
#python3
from urllib.parse import urlencode
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)
doseq=True
.
Może szukasz czegoś takiego:
def dictToQuery(d):
query = ''
for key in d.keys():
query += str(key) + '=' + str(d[key]) + "&"
return query
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.
str.join()
? A co powiesz urllib.quote_plus()
?
urlencode
w 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ą.
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 ().