2010-04-03 15 views
30

Próbuję zawęzić kod słownika w python z urllib.urlencode. Problem polega na tym, że muszę zakodować tablicę.urlencode tablica wartości

Wynik musi być:

criterias%5B%5D=member&criterias%5B%5D=issue 
#unquoted: criterias[]=member&criterias[]=issue 

Ale wynik pojawia się:

criterias=%5B%27member%27%2C+%27issue%27%5D 
#unquoted: criterias=['member',+'issue'] 

Próbowałem kilka rzeczy, ale nie wydaje się uzyskać odpowiedni efekt.

import urllib 
criterias = ['member', 'issue'] 
params = { 
    'criterias[]': criterias, 
} 
print urllib.urlencode(params) 

Jeśli używam cgi.parse_qs zdekodować poprawną ciąg kwerendy, mam to w wyniku:

{'criterias[]': ['member', 'issue']} 

Ale jeśli zakodować tego rezultatu, mam zły wynik z powrotem. Czy istnieje sposób na uzyskanie oczekiwanego rezultatu?

+0

'cig.parse_qs' jest przestarzałe (zachowane tylko dla zgodności z poprzednimi wersjami), więc może być lepiej użyć' urlparse.parse_qs' – ChristopheD

+0

Dzięki za napiwek. Używałem go tylko do porównania, więc tak naprawdę nie jest używany. – Ikke

Odpowiedz

53

Rozwiązanie jest o wiele prostsze niż te wymienione powyżej.

>>> import urllib 
>>> params = {'criterias[]': ['member', 'issue']} 
>>> 
>>> print urllib.urlencode(params, True) 
criterias%5B%5D=member&criterias%5B%5D=issue 

Uwaga na wartość True. Zobacz http://docs.python.org/library/urllib.html#urllib.urlencode zmienną doseq.

Na marginesie: nie potrzebujesz [], aby działał jak tablica (dlatego urllib go nie uwzględnia). Oznacza to, że nie musisz dodawać [] do wszystkich kluczy tablicy.

+0

Jeśli nie dodasz [], php użyje kryterium = issue i zignoruje "członka" –

+0

Zobacz także odpowiedź na to pytanie: http://stackoverflow.com/questions/6243051/how-to -pass-an-array-in-zapytanie-string –

+1

Aby wyjaśnić, Python nie dba o to, czy '[]' s są tam: to przekonwertuje poprawnie, niezależnie. Ale tak, PHP (i być może inne języki?) Ma na uwadze, więc jeśli masz zewnętrzną zależność od takich systemów, najlepiej jest zostawić '[]' s ... to po prostu wygląda dziwnie w Pythonie. – CSTobey

10

Można użyć listę par klucz-wartość (krotki)

>>> urllib.urlencode([('criterias[]', 'member'), ('criterias[]', 'issue')]) 
'criterias%5B%5D=member&criterias%5B%5D=issue' 
+0

Szkoda, że ​​to jedyny sposób. ale rozwiązał problem. – Ikke

+0

Cóż, bardzo łatwo jest napisać funkcję przekształcającą dicta z listami na listę krotek. –

+0

Po prostu uwaga dla innych, aby wygenerować kodowany wenflonem ciąg prosto z normalnego dyktatu, wszystko, co musisz zrobić, to 'urllib.urlencode (d.items())' – dlrust

2

Listcomp wartości:

>>> criterias = ['member', 'issue'] 
>>> urllib.urlencode([('criterias[]', i) for i in criterias]) 
'criterias%5B%5D=member&criterias%5B%5D=issue' 
>>> 
2

abstrahować to się do pracy w dowolnym słowniku parametrów i przekształcić go w lista krotek:

import urllib 

def url_encode_params(params={}): 
    if not isinstance(params, dict): 
     raise Exception("You must pass in a dictionary!") 
    params_list = [] 
    for k,v in params.items(): 
     if isinstance(v, list): params_list.extend([(k, x) for x in v]) 
     else: params_list.append((k, v)) 
    return urllib.urlencode(params_list) 

Która teraz powinna działać dla obu powyższych przykładów, jak również dla słownika z pewnymi łańcuchami a a niektóre tablice jako wartości:

criterias = ['member', 'issue'] 
params = { 
    'criterias[]': criterias, 
} 
url_encode_params(params) 
>>'criterias%5B%5D=member&criterias%5B%5D=issue' 
Powiązane problemy