2010-05-20 10 views
9

Ich bin gespannt, ob es einen einfacheren Weg gibt, einen bestimmten Parameter aus einer URL zu entfernen. Was ich mir ausgedacht habe, ist folgendes. Dies scheint ein bisschen ausführlich. Bibliotheken zu verwenden oder eine mehr pythonische Version geschätzt.Gibt es eine bessere Möglichkeit, diese URL-Manipulation in Python zu schreiben?

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) 

Antwort

8

ich eine kleine Hilfsklasse erstellt haben eine URL in einer strukturierten Art und Weise darzustellen:

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)) 

Dann können Sie tun:

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

Mehr dazu: Web development peeve.

+0

Ein vernünftiger Kompromiss. Weitaus nützlicher als URLParse würde ich sagen;) – dnolen

+0

Ich habe einige [Änderungen an dieser Klasse] gemacht (http://twigstechtips.blogspot.com/2011/02/python-simple-query-string-manipulation.html), Es ist ein bisschen einfacher zu benutzen. – twig

10

Verwenden Sie urlparse.parse_qsl(), um die Abfragezeichenfolge zu knacken. Sie können diesen Filter in einem Rutsch:

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

+1. Schöne Python. –

+0

Die URL-Manipulation hier scheint gefoltert sogar mit Ihrer kleinen Änderung. – dnolen

+0

@dnolen: Ich stimme zu. Pythons eingebaute Bibliotheken sind nicht besonders gut für einfache URI-Manipulation. (Hast du mich runter gelobt? Wenn ja, dann scheint es kaum vernünftig, jemanden aufgrund von Einschränkungen in der Sprache oder seinen Bibliotheken zu beleidigen.) –

Verwandte Themen