2011-10-18 14 views
67

Después de usar cgi.parse_qs(), ¿cómo convertir el resultado (diccionario) a la cadena de consulta? Buscando algo similar a urllib.urlencode().¿Cómo convertir un diccionario a una cadena de consulta en Python?

+5

NB: ['cgi.parse_qs()' está en desuso. Use urlparse.parse_qs() en su lugar.] (Http://docs.python.org/library/cgi.html#cgi.parse_qs) – Johnsyweb

+0

** Vea también: ** https://stackoverflow.com/questions/5607551/ how-to-urlencode-a-querystring-in-python – dreftymac

Respuesta

113

De the docs:

urllib.urlencode (query [, doseq])
Convierte un objeto de asignación de o una secuencia de tuplas de dos elementos para una cadena “por ciento codificado” ... una serie de key=value pares separados por '&' caracteres ...

a dict es un mapeo.

+0

Esto es cierto, pero el 'dict' devuelto por' cgi.parse_qs() 'en realidad tiene' list's como sus "valores". Pasar estos directamente dará lugar a cadenas de consulta de aspecto muy extraño. – Johnsyweb

+5

Como dicen los documentos, para eso se usa 'doseq'. –

+0

Cierto. ¡Eso me enseñará a leer más que la primera oración! – Johnsyweb

-1

Tal vez usted está buscando algo como esto:

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

Se necesita un diccionario y convertirlo en una cadena de consulta, al igual que urlencode. Agregará un "& final" a la cadena de consulta, pero return query[:-1] lo corrige, si es un problema.

+4

¿Ya conociste 'str.join()'? ¿Qué tal 'urllib.quote_plus()'? –

+1

@garbados Su solución debería funcionar en casos simples. Sin embargo, eche un vistazo a 'urlencode' en' urllib.py' (debe hacerlo en su instalación de Python) para ver por qué la creación de una cadena de consulta a veces no es tan simple como lo implica su respuesta (en particular, la necesidad de 'citar' ciertos caracteres que no son válidos en una URL). @ Ignacio también ha hecho referencia a dos funciones que limpiarían su implementación y la corregirían. –

+0

Ah, de hecho. Perdón por la cruda implementación. Va a mostrar que debería ser más cuidadoso al responder preguntas que nunca me he enfrentado. – garbados

4

Usted está buscando algo exactamente como urllib.urlencode()!

Sin embargo, cuando se llama parse_qs() (distinta de parse_qsl()), las claves del diccionario son los nombres de las variables de consulta única y los valores son listas de valores para cada nombre.

Para pasar esta información al urllib.urlencode(), debe "aplanar" estas listas. He aquí cómo usted puede hacerlo con una lista comprehenshion de tuplas:

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

O podría pasar 'doseq = True'. –

+5

¡O podría leer la documentación y hacer eso! Sí :-) – Johnsyweb

+0

@downvoter: ¿Cómo podría mejorar esta respuesta? ¡Han pasado seis años desde que lo escribí! – Johnsyweb

27

En python3, ligeramente diferente:

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

de salida: 'pram1=foo&param2=bar'

para python2 y compatibilidad python3, intente esto:

try: 
    #python2 
    from urllib import urlencode 
except ImportError: 
    #python3 
    from urllib.parse import urlencode 
Cuestiones relacionadas