Supongamos que me dieron una URL.
Puede que ya tenga parámetros GET (p http://example.com/search?q=question
. Ej. ) O puede que no (p http://example.com/
. Ej .).
Y ahora necesito agregarle algunos parámetros {'lang':'en','tag':'python'}
. En el primer caso voy a tener http://example.com/search?q=question&lang=en&tag=python
y en el segundo - http://example.com/search?lang=en&tag=python
.
¿Hay alguna forma estándar de hacer esto?
urlparse.parse_qs
lugar deparse_qsl
. Este último devuelve una lista mientras que desea un dict. Ver docs.python.org/library/urlparse.html#urlparse.parse_qs .urlencode
comourllib.urlencode(query, doseq=True)
. De lo contrario, los parámetros que existían en la url original no se conservan correctamente (porque se devuelven como tuplas de @ parse_qs @urlparse()
yurlsplit()
son en realidadnamedtuple
instancias. Por lo tanto, puede asignarlos directamente a una variable y usarurl_parts = url_parts._replace(query = …)
para actualizarla.Por qué
No estoy satisfecho con todas las soluciones en esta página ( vamos, ¿dónde está nuestro elemento favorito de copiar y pegar? ), Así que escribí el mío basado en las respuestas aquí. Intenta ser completo y más pitónico. He agregado un controlador para los valores dict y bool en los argumentos para que sean más amigables con el lado del consumidor ( JS ), pero aún son opcionales, puede descartarlos.
Cómo funciona
Prueba 1: Agregar nuevos argumentos, manejar matrices y valores Bool:
Prueba 2: reescribiendo argumentos existentes, manejando valores DICT:
Hablar es barato. Muéstrame el código.
Código en sí mismo. He tratado de describirlo en detalle:
Tenga en cuenta que puede haber algunos problemas, si encuentra uno, avíseme y lo mejoraremos
fuente
http://stackoverflow.com/with%2Fencoded?data=some&data=values&answe%2rs=false
. Además, use tres galones>>>
para ayudar a los doctests a recoger sus doctestsparsed_get_args = dict(parse_qsl(get_args))
aparsed_get_args = parse_qs(get_args)
Desea utilizar la codificación de URL si las cadenas pueden tener datos arbitrarios (por ejemplo, se necesitarán codificar caracteres como símbolos de unión, barras inclinadas, etc.).
Echa un vistazo a urllib.urlencode:
En python3:
fuente
También puede usar el módulo furl https://github.com/gruns/furl
fuente
Subcontratarlo a la biblioteca de solicitudes de prueba de batalla .
Así es como lo haré:
fuente
Si está utilizando las solicitudes lib :
fuente
Sí: usa urllib .
De los ejemplos en la documentación:
fuente
Basado en esta respuesta, una línea para casos simples (código Python 3):
o:
fuente
?
ancla (#?stuff
).Esto me parece más elegante que las dos respuestas principales:
Las cosas más importantes que no me gustan en las respuestas principales (sin embargo, son buenas):
query
está en los componentes de la URLParseResult
Lo malo de mi respuesta es la
dict
fusión mágicamente usando el desempaquetado, pero prefiero eso a actualizar un diccionario ya existente debido a mi prejuicio contra la mutabilidad.fuente
Me gustó la versión Łukasz, pero dado que las funciones urllib y urllparse son algo incómodas de usar en este caso, creo que es más sencillo hacer algo como esto:
fuente
Use las diversas
urlparse
funciones para separar la URL existente,urllib.urlencode()
en el diccionario combinado, y luegourlparse.urlunparse()
volver a armar todo.O simplemente tome el resultado
urllib.urlencode()
y concatenelo a la URL de manera apropiada.fuente
Otra respuesta más:
fuente
Así es como lo implementé.
Trabajado como un encanto. Sin embargo, me hubiera gustado una forma más limpia de implementar esto.
Otra forma de implementar lo anterior es ponerlo en un método.
fuente
En python 2.5
fuente