Создатель url для python
Я знаю о urllib
и urlparse
, но я хочу убедиться, что не буду изобретать колесо.
Моя проблема в том, что я собираюсь собрать кучу URL-адресов из одного домена через библиотеку urllib
. Я в основном хочу иметь возможность генерировать URL-адреса для использования (как строки) с разными путями и параметрами запроса. Я надеялся, что что-то может иметь синтаксис вроде:
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
, а не постоянно портить код, передавая весь набор каждый раз.
Есть ли что-то подобное? Согласны ли люди с этим вместе?
Ответы
Ответ 1
Все еще не совсем уверен, что вы ищете... Но я дам ему шанс. Если вы просто хотите создать класс, который сохранит ваши значения по умолчанию и т.д., Он достаточно прост, чтобы создать свой собственный класс и использовать магию 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')
Если вы ищете больше шаблона проектирования Builder, Статья в Википедии имеет разумный пример Python (а также Java).
Ответ 2
Вы предлагаете расширение 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
Возможно, вам стоит подумать о том, чтобы взглянуть на furl, поскольку это может быть ответом на ваши потребности.
Ответ 4
Я думаю, вы хотите http://pythonhosted.org/uritools/.
Пример из документов:
parts = urisplit('foo://[email protected]:8042/over/there?name=ferret#nose')
orig_uri = uriunsplit(parts)
Значение split - это именованный кортеж, а не обычный список. Доступно по имени или индексу:
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)
Сделайте копию для внесения изменений:
new_parts = [part for part in parts]
new_parts[2] = "/some/other/path"
new_uri = uriunsplit(new_parts)