2010-05-20 89 views
9

我很好奇,如果有一種更簡單的方法從url中刪除特定的參數。我想到的是以下內容。這似乎有點冗長。圖書館使用或更pythonic版本讚賞。有沒有更好的方式在Python中編寫這個URL操作?

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) 

回答

8

我創建了一個小的輔助類來表示一個結構化的方式網址:您可以一氣呵成過濾此

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

然後,你可以這樣做:

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

更多相關信息:Web development peeve

+0

合理的妥協。我會說比urlparse更有用;) – dnolen 2010-05-21 04:47:49

+0

我已經對這個類進行了一些修改(http://twigstechtips.blogspot.com/2011/02/python-simple-query-string-manipulation.html),使它更容易使用。 – twig 2015-11-25 05:19:22

10

使用urlparse.parse_qsl()破解的查詢字符串。

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

+1。美麗的Python。 – 2010-05-20 12:14:28

+0

這裏的url操作即使在你的小變化下也似乎受到了折磨。 – dnolen 2010-05-20 17:25:32

+0

@dnolen:我同意。 Python的烘焙庫對於簡單的URI操作並不是特別有用。 (如果是這樣,那麼由於語言或圖書館的限制而使某人倒下似乎不合情理。) – 2010-05-21 00:14:10

相關問題