Después de usar cgi.parse_qs()
, ¿cómo convertir el resultado (diccionario) de nuevo a una cadena de consulta? Buscando algo similar a urllib.urlencode()
.
Después de usar cgi.parse_qs()
, ¿cómo convertir el resultado (diccionario) de nuevo a una cadena de consulta? Buscando algo similar a urllib.urlencode()
.
Respuestas:
urllib.parse.
urlencode
(consulta, doseq = False, [...])Convierta un objeto de mapeo o una secuencia de tuplas de dos elementos, que pueden contener objetos str o bytes, en una cadena de texto ASCII codificada en porcentaje.
A dict
es un mapeo.
urllib.urlencode
(query
[,doseq
])
Convertir un objeto de mapeo o una secuencia de tuplas de dos elementos en una cadena de "porcentaje codificado" ... una serie dekey=value
pares separados por'&'
caracteres ...
dict
devuelto por en cgi.parse_qs()
realidad tiene list
s como sus "valores". Pasar estos directamente dará como resultado cadenas de consulta de aspecto muy extraño.
En python3, ligeramente diferente:
from urllib.parse import urlencode
urlencode({'pram1': 'foo', 'param2': 'bar'})
salida: 'pram1=foo¶m2=bar'
para compatibilidad con python2 y python3, intente esto:
try:
#python2
from urllib import urlencode
except ImportError:
#python3
from urllib.parse import urlencode
¡Estás buscando algo exactamente igual urllib.urlencode()
!
Sin embargo, cuando llama parse_qs()
(distinto de parse_qsl()
), las claves del diccionario son los nombres únicos de las variables de consulta y los valores son listas de valores para cada nombre.
Para pasar esta información urllib.urlencode()
, debe "aplanar" estas listas. Así es como puede hacerlo con una lista de comprensión de tuplas:
query_pairs = [(k,v) for k,vlist in d.iteritems() for v in vlist]
urllib.urlencode(query_pairs)
doseq=True
.
Quizás estés buscando algo como esto:
def dictToQuery(d):
query = ''
for key in d.keys():
query += str(key) + '=' + str(d[key]) + "&"
return query
Toma un diccionario y lo convierte en una cadena de consulta, como urlencode. Agregará un "&" final a la cadena de consulta, pero lo return query[:-1]
corrige si es un problema.
str.join()
? ¿Qué tal urllib.quote_plus()
?
urlencode
en urllib.py
(debe por su pitón en la instalación) para ver qué crear una cadena de consulta a veces no es tan simple como su respuesta implica (en particular, la necesidad de 'cita' 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.
from urllib.parse import urlencode; urlencode(your_dict)
) es más corta y más fácil que esta! Reconozco que a veces es inteligente reinventar la rueda, incluso aunque sea de mala calidad, cuando es caro o inconveniente acceder a las ruedas existentes y bien diseñadas, pero aquí usar la rueda estándar es más fácil y rápido que hacer rodar una rueda inferior. .
cgi.parse_qs()
está en desuso. Utilice urlparse.parse_qs () en su lugar.