2011-10-18 9 views
67

Po użyciu cgi.parse_qs(), jak przekonwertować wynik (słownik) z powrotem na ciąg zapytania? Szukam czegoś podobnego do urllib.urlencode().Jak przekonwertować słownik na ciąg zapytania w języku Python?

+5

UWAGA: ['cgi.parse_qs()' jest przestarzałe. Zamiast tego użyj funkcji urlparse.parse_qs().] (Http://docs.python.org/library/cgi.html#cgi.parse_qs) – Johnsyweb

+0

** Zobacz też: ** https://stackoverflow.com/questions/5607551/ how-to-urlencode-a-querystring-in-python – dreftymac

Odpowiedz

113

Z the docs:

urllib.urlencode (query [, doseq])
Konwersja obiekt mapowania lub sekwencja krotki dwuelementowych do „procent” zakodowany ciąg ... seria od key=value parami oddzielonych '&' postaci ...

A dict jest odwzorowaniem.

+0

To prawda, ale 'dict' zwrócony przez' cgi.parse_qs() 'faktycznie ma' list's jako swoje "wartości". Przejście od razu spowoduje bardzo dziwnie wyglądające ciągi zapytań. – Johnsyweb

+5

Jak mówią doktorzy, właśnie do tego służy 'doseq'. –

+0

To prawda. To nauczy mnie czytać więcej niż pierwsze zdanie! – Johnsyweb

-1

Może szukasz czegoś takiego:

def dictToQuery(d): 
    query = '' 
    for key in d.keys(): 
    query += str(key) + '=' + str(d[key]) + "&" 
    return query 

Zajmuje słownika i przekształcić go w ciągu zapytania, podobnie jak urlencode. Dopisze to ciąg "&" do ciągu zapytania, ale return query[:-1] naprawi to, jeśli jest to problem.

+4

Czy spotkałeś jeszcze 'str.join()'? Co powiesz na 'urllib.quote_plus()'? –

+1

@garbados Twoje rozwiązanie powinno działać w prostych przypadkach. Jednak spójrz na 'urlencode' w' urllib.py' (powinno to być w twojej instalacji Pythona), aby zobaczyć, dlaczego tworzenie ciągu zapytania nie jest tak proste, jak sugeruje twoja odpowiedź (w szczególności potrzeba "cytowania" pewnych znaków, które nie są poprawne w adresie URL). @Ignacio wspomniał również o dwóch funkcjach, które wyczyściłyby twoją implementację i poprawią ją. –

+0

Ach, w rzeczy samej. Przepraszam za wykonanie cruddy. Chodzi o to, że powinienem być bardziej ostrożny i odpowiadać na pytania, z którymi nigdy się nie spotkałem. – garbados

4

Poszukujesz czegoś dokładnie jak urllib.urlencode()!

Jednak kiedy zadzwonić parse_qs() (odrębny od parse_qsl()), słownik klucze są nazwy zmiennych wyjątkowy zapytań i wartości są wykazy wartości dla każdej nazwy.

Aby przekazać tę informację do urllib.urlencode(), należy "spłaszczyć" te listy. Oto w jaki sposób można to zrobić z listą comprehenshion krotek:

query_pairs = [(k,v) for k,vlist in d.iteritems() for v in vlist] 
urllib.urlencode(query_pairs) 
+11

Albo możesz przekazać 'doseq = True'. –

+5

Czy mogę przeczytać dokumentację i zrobić to! Tak :-) – Johnsyweb

+0

@downvoter: Jak mogę poprawić tę odpowiedź? Minęło sześć lat, odkąd to napisałem! – Johnsyweb

27

W python3, nieco inny:

from urllib.parse import urlencode 
urlencode({'pram1': 'foo', 'param2': 'bar'}) 

wyjściowa: 'pram1=foo&param2=bar'

dla python2 i kompatybilności python3, spróbuj tego:

try: 
    #python2 
    from urllib import urlencode 
except ImportError: 
    #python3 
    from urllib.parse import urlencode 
Powiązane problemy