2010-05-20 21 views
9

Tengo curiosidad si hay una manera más simple de eliminar un parámetro en particular de una url. Lo que se me ocurrió es lo siguiente. Esto parece un poco detallado. Bibliotecas para usar o una versión más pythonic apreciada.¿Existe alguna forma mejor de escribir esta Manipulación de URL en Python?

parsed = urlparse(url) 
if parsed.query != "": 
    params = dict([s.split("=") for s in parsed.query.split("&")]) 
    if params.get("page"): 
     del params["page"] 
    url = urlunparse((parsed.scheme, 
         None, 
         parsed.path, 
         None, 
         urlencode(params.items()), 
         parsed.fragment,)) 
    parsed = urlparse(url) 

Respuesta

8

He creado una pequeña clase de ayuda para representar una url de una manera estructurada:

import cgi, urllib, urlparse 

class Url(object): 
    def __init__(self, url): 
     """Construct from a string.""" 
     self.scheme, self.netloc, self.path, self.params, self.query, self.fragment = urlparse.urlparse(url) 
     self.args = dict(cgi.parse_qsl(self.query)) 

    def __str__(self): 
     """Turn back into a URL.""" 
     self.query = urllib.urlencode(self.args) 
     return urlparse.urlunparse((self.scheme, self.netloc, self.path, self.params, self.query, self.fragment)) 

entonces usted puede hacer:

u = Url(url) 
del u.args['page'] 
url = str(u) 

Más sobre esto: Web development peeve.

+0

Un compromiso razonable. Mucho más útil que urlparse diría;) – dnolen

+0

He hecho algunas [modificaciones a esta clase] (http://twigstechtips.blogspot.com/2011/02/python-simple-query-string-manipulation.html), haciéndolo un poco más fácil de usar. – twig

10

Usa urlparse.parse_qsl() para crackear la cadena de consulta. Puede filtrar esta en una sola vez:

params = [(k,v) for (k,v) in parse_qsl(parsed.query) if k != 'page'] 
+0

+1. Hermosa Python. –

+0

La manipulación de URL aquí parece torturada incluso con su cambio menor. – dnolen

+0

@dnolen: Estoy de acuerdo. Las bibliotecas de Python no son especialmente buenas para la manipulación simple de URI. (¿Me perdonó?) Si es así, parece poco razonable rechazar a alguien debido a limitaciones en el idioma o sus bibliotecas.) –

Cuestiones relacionadas