Python的URL构建器

10 投票
4 回答
13484 浏览
提问于 2025-04-15 15:11

我知道有 urlliburlparse 这两个库,但我想确认一下我不会重复造轮子。

我的问题是,我需要通过 urllib 库从同一个网站获取一堆网址。我基本上想生成一些网址(作为字符串),这些网址有不同的路径和查询参数。我希望能有类似这样的语法:

url_builder = UrlBuilder("some.domain.com")
# should give me "http://some.domain.com/blah?foo=bar
url_i_need_to_hit = url_builder.withPath("blah").withParams("foo=bar")  # maybe a ".build()" after this

简单来说,我想存储一些默认值,这样就可以传给 urlparse.urlunsplit,而不是每次都要把整个元组传进去,这样代码就不会显得那么复杂。

有没有类似的东西存在?大家觉得这样做值得吗?

4 个回答

4

你可以看看 furl,因为它可能正好符合你的需求。

4

你是在提议对http://docs.python.org/library/urlparse.html#urlparse.urlunparse这个链接进行扩展,让它可以替换成6个项目的元组吗?

你是想说像这样的吗?

def myUnparse( someTuple, scheme=None, netloc=None, path=None, etc. ):
    parts = list( someTuple )
    if scheme is not None: parts[0] = scheme
    if netloc is not None: parts[1]= netloc
    if path is not None: parts[2]= path
    etc.
    return urlunparse( parts )

这就是你想提议的内容吗?

这个?

class URLBuilder( object ):
    def __init__( self, base ):
        self.parts = list( urlparse(base) )
    def __call__( self, scheme=None, netloc=None, path=None, etc. ):
        if scheme is not None: self.parts[0] = scheme
        if netloc is not None: self.parts[1]= netloc
        if path is not None: self.parts[2]= path
        etc.
        return urlunparse( self.parts )

bldr= URLBuilder( someURL )
print bldr( scheme="ftp" )

类似这样的东西吗?

3

我还是不太明白你具体想要什么……不过我试试看。如果你只是想创建一个类来保存默认值之类的东西,其实很简单,你可以自己写一个类,然后用Python的一些特性,比如str。下面是一个简单的例子(虽然不是最优的):

class UrlBuilder:
    def __init__(self,domain,path="blah",params="foo=bar"):
        self.domain = domain
        self.path = path
        self.params = params

    def withPath(self,path):
        self.path = path
        return self

    def withParams(self,params):
        self.params = params
        return self

    def __str__(self):
        return 'http://' + self.domain + '/' + self.path + '?' + self.params
        # or return urlparse.urlunparse( ( "http", self.domain, self.path, self.params, "", "" )

    def build(self):
        return self.__str__()

if __name__ == '__main__':
    u = UrlBuilder('www.example.com')
    print u.withPath('bobloblaw')
    print u.withParams('lawyer=yes')
    print u.withPath('elvis').withParams('theking=true')

如果你想了解更多关于构建者设计模式的内容,可以看看维基百科上的Python示例(还有Java示例)。

撰写回答