2010-04-03 13 views
30

Ich versuche, ein Wörterbuch in Python mit urllib.urlencode urlencode. Das Problem ist, ich muss ein Array codieren.Urlencode ein Array von Werten

Das Ergebnis muss sein:

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

Aber das Ergebnis, das ich bekommen ist:

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

ich mehrere Dinge ausprobiert haben, aber ich kann nicht scheinen, das richtige Ergebnis zu bekommen.

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

Wenn ich cgi.parse_qs verwenden, um eine korrekte Abfrage-String zu dekodieren, erhalte ich dies als Ergebnis:

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

Aber wenn ich dieses Ergebnis kodieren, bekomme ich wieder ein falsches Ergebnis. Gibt es eine Möglichkeit, das erwartete Ergebnis zu erzielen?

+0

'cig.parse_qs' ist veraltet (wird nur aus Gründen der Abwärtskompatibilität beibehalten), daher ist es besser,' urlparse.parse_qs' zu verwenden. – ChristopheD

+0

Danke für den Tipp. Ich habe es nur zum Vergleich benutzt, also wird es nicht wirklich benutzt. – Ikke

Antwort

53

Die Lösung ist viel einfacher als die oben aufgeführten.

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

Beachten Sie die True. Siehe http://docs.python.org/library/urllib.html#urllib.urlencode die doseq-Variable.

Als eine Randnotiz benötigen Sie nicht das [], damit es als ein Array funktioniert (weshalb urllib es nicht enthält). Das bedeutet, dass Sie [] nicht zu allen Ihren Array-Schlüsseln hinzufügen müssen.

+0

Wenn Sie das [] nicht hinzufügen, verwendet PHP nur criterias = issue und ignoriert das "member". –

+0

Siehe auch die Antwort für diese Frage: http://StackOverflow.com/questions/6243051/how-to -pass-an-array-in-einem-query-string –

+1

Um es klarzustellen, Python ist es egal, ob die '[]' s da sind: es wird es trotzdem korrekt konvertieren. Aber ja, PHP (und vielleicht andere Sprachen?) Ist es egal, wenn Sie also eine externe Abhängigkeit von solchen Systemen haben, ist es am besten, die '[]' s zu lassen ... es sieht in Python einfach komisch aus. – CSTobey

10

Sie können eine Liste von Schlüssel-Wert-Paare verwenden (Tupel):

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

Schade, das ist der einzige Weg. aber es löste das Problem. – Ikke

+0

Nun, es ist sehr einfach, eine Funktion zu schreiben, die das Diktat mit Listen in eine Liste von Tupeln umwandelt. –

+0

nur eine Anmerkung für andere, um die urlencoded Zeichenfolge direkt aus einem regulären dict zu generieren, alles, was Sie tun müssen, ist 'urllib.urlencode (d.items()) ' – dlrust

2

Listcomp der Werte:

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

Abstrahieren dieser heraus für jeden Parameter Wörterbuch zu arbeiten und wandeln es in eine Liste von Tupeln:

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) 

Welches sollte jetzt sowohl für das obige Beispiel als auch ein Wörterbuch mit einigen Zeichenfolgen funktionieren a nd einige Arrays als Werte:

criterias = ['member', 'issue'] 
params = { 
    'criterias[]': criterias, 
} 
url_encode_params(params) 
>>'criterias%5B%5D=member&criterias%5B%5D=issue' 
Verwandte Themen