2010-05-20 79 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

相关问题