Создатель 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)