2010-11-27 14 views

Respuesta

9

Uso urlsplit() para extraer la cadena de consulta, parse_qsl() analizarlo (o parse_qs() si no se preocupan por orden de los argumentos), añadir el nuevo argumento, urlencode() para convertirla de nuevo en una cadena de consulta, urlunsplit() para volver a fusionarlo en una sola URL, luego redirigir al cliente.

0
import urllib 
url = "/scr.cgi?q=1&ln=0" 
param = urllib.urlencode({'SOME&STRING':1}) 
url = url.endswith('&') and (url + param) or (url + '&' + param) 

the docs

67

Puede utilizar urlsplit() y urlunsplit() para romper y reconstruir una dirección URL, a continuación, utilizar urlencode() en la cadena de consulta analizada:

from urllib import urlencode 
from urlparse import parse_qs, urlsplit, urlunsplit 

def set_query_parameter(url, param_name, param_value): 
    """Given a URL, set or replace a query parameter and return the 
    modified URL. 

    >>> set_query_parameter('http://example.com?foo=bar&biz=baz', 'foo', 'stuff') 
    'http://example.com?foo=stuff&biz=baz' 

    """ 
    scheme, netloc, path, query_string, fragment = urlsplit(url) 
    query_params = parse_qs(query_string) 

    query_params[param_name] = [param_value] 
    new_query_string = urlencode(query_params, doseq=True) 

    return urlunsplit((scheme, netloc, path, new_query_string, fragment)) 

utilizarlo como sigue:

>>> set_query_parameter("/scr.cgi?q=1&ln=0", "SOMESTRING", 1) 
'/scr.cgi?q=1&ln=0&SOMESTRING=1' 
+0

que lo utilizaron para la paginación y funcionó como un encanto. ¡Gracias! – Jabba

+0

Aunque tengo varios años, todavía siento la necesidad de señalar esto ya que esta pregunta aparece en la primera página de las búsquedas de Google: si le importa el orden de los parámetros (que supongo que debe hacer, debido a la 'doseq = True' parte), debe utilizar 'parse_qsl()', en lugar de 'parse_qs()' - el primero devuelve una lista de tuplas, mientras que el último devuelve un dict, que ** no ** garantiza conservar orden cuando se repite. Entonces, agregar un parámetro se puede hacer a través de 'query_params.append ((param_name, param_value))'. – mhouglum

0

Puede utilizar Python biblioteca de manipulación de url furl.

import furl 
f = furl.furl("/scr.cgi?q=1&ln=0") 
f.args['SOMESTRING'] = 1 
print(f.url) 
+0

No parece que furl sea un módulo integrado, por lo que tendría que instalarse primero. – commadelimited

Cuestiones relacionadas