python python的url构建器
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1590219/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
url builder for python
提问by Tom
I know about urllib
and urlparse
, but I want to make sure I wouldn't be reinventing the wheel.
我知道urllib
and urlparse
,但我想确保我不会重新发明轮子。
My problem is that I am going to be fetching a bunch of urls from the same domain via the urllib
library. I basically want to be able to generate urls to use (as strings) with different paths and query params. I was hoping that something might have a syntax like:
我的问题是我将通过urllib
库从同一个域中获取一堆 url 。我基本上希望能够生成 urls 以使用(作为字符串)具有不同的路径和查询参数。我希望某些东西可能有这样的语法:
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
Basically I want to be able to store defaults that get passed to urlparse.urlunsplit
instead of constantly clouding up the code by passing in the whole tuple every time.
基本上,我希望能够存储传递给的默认值,urlparse.urlunsplit
而不是通过每次传入整个元组来不断地使代码变得模糊。
Does something like this exist? Do people agree it's worth throwing together?
这样的东西存在吗?人们是否同意将其放在一起?
采纳答案by ewall
Still not quite sure what you're looking for... But I'll give it a shot. If you're just looking to make a class that will keep your default values and such, it's simple enough to make your own class and use Python magic like str. Here's a scratched-out example (suboptimal):
仍然不太确定你在寻找什么......但我会试一试。如果您只是想创建一个保留默认值等的类,那么创建自己的类并使用像str这样的 Python 魔法就足够简单了。这是一个划掉的例子(次优):
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')
If you're looking for more of the Builder Design Pattern, the Wikipedia article has a reasonable Python example(as well as Java).
如果您正在寻找更多的 Builder Design Pattern,维基百科文章有一个合理的 Python 示例(以及Java)。
回答by S.Lott
Are you proposing an extension to http://docs.python.org/library/urlparse.html#urlparse.urlunparsethat would substitute into the 6-item tuple?
您是否提议对http://docs.python.org/library/urlparse.html#urlparse.urlunparse进行扩展以替代 6 项元组?
Are you talking about something like this?
你在谈论这样的事情吗?
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 )
Is that what you're proposing?
那是你提议的吗?
This?
这?
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" )
Something like that?
类似的东西?
回答by neutrinus
回答by Scott Smith
I think you want http://pythonhosted.org/uritools/.
我想你想要http://pythonhosted.org/uritools/。
Example from the docs:
文档中的示例:
parts = urisplit('foo://[email protected]:8042/over/there?name=ferret#nose')
orig_uri = uriunsplit(parts)
The split value is a named tuple, not a regular list. It is accessible by name or index:
拆分值是一个命名元组,而不是常规列表。它可以通过名称或索引访问:
assert(parts[0] == parts.schema)
assert(parts[1] == parts.authority)
assert(parts[2] == parts.path)
assert(parts[3] == parts.query)
assert(parts[4] == parts.fragment)
Make a copy to make changes:
复制以进行更改:
new_parts = [part for part in parts]
new_parts[2] = "/some/other/path"
new_uri = uriunsplit(new_parts)