Python的URL构建器
我知道有 urllib
和 urlparse
这两个库,但我想确认一下我不会重复造轮子。
我的问题是,我需要通过 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示例)。