2010-05-20 33 views
9

Tôi rất tò mò nếu có cách đơn giản hơn để xóa thông số cụ thể khỏi url. Những gì tôi nghĩ ra là như sau. Điều này có vẻ hơi dài dòng. Thư viện để sử dụng hoặc một phiên bản nhiều hơn pythonic đánh giá cao.Có cách nào tốt hơn để viết Thao tác URL này bằng Python không?

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) 

Trả lời

8

tôi đã tạo ra một lớp helper nhỏ để đại diện cho một url trong một cách có cấu trúc:

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

Sau đó, bạn có thể làm:

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

Tìm hiểu thêm về điều này: Web development peeve.

+0

Một thỏa hiệp hợp lý. Xa hơn hữu ích hơn urlparse tôi sẽ nói;) – dnolen

+0

Tôi đã thực hiện một số [sửa đổi cho lớp này] (http://twigstechtips.blogspot.com/2011/02/python-simple-query-string-manipulation.html), làm cho nó dễ sử dụng hơn một chút. – twig

10

Sử dụng urlparse.parse_qsl() để crack chuỗi truy vấn. Bạn có thể lọc này chỉ trong một bước:

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

+1. Python đẹp. –

+0

Thao tác url ở đây dường như bị tra tấn ngay cả với thay đổi nhỏ của bạn. – dnolen

+0

@dnolen: Tôi đồng ý. Các thư viện có sẵn của Python không đặc biệt tốt cho thao tác URI đơn giản. Nếu bạn làm như vậy, có vẻ như không hợp lý để giảm bớt ai đó vì những hạn chế trong ngôn ngữ hoặc thư viện của nó.) –

Các vấn đề liên quan