Как я могу получить базу URL-адреса в Python?

Я пытаюсь определить базу URL-адреса или все, кроме страницы и параметров. Я попытался использовать split, но есть ли лучший способ, чем разделить его на кусочки? Есть ли способ удалить все из последнего "/"?

Учитывая это: http://127.0.0.1/asdf/login.php

Я хотел бы: http://127.0.0.1/asdf/

Ответ 1

Ну, для одного, вы могли бы просто использовать os.path.dirname:

>>> os.path.dirname('http://127.0.0.1/asdf/login.php')
'http://127.0.0.1/asdf'

Это явно не относится к URL-адресам, но с ними работает (даже в Windows), это просто не оставляет конечной косой черты (вы можете просто добавить ее обратно самостоятельно).

Вы также можете посмотреть на urllib.parse.urlparse для более тонкого разбора; если URL-адрес содержит строку запроса или хеш, вы должны проанализировать ее на части, обрезать компонент path возвращаемый путем разбора, а затем рекомбинировать, поэтому путь обрезается без потери запроса и хэш-информации.

Наконец, если вы хотите просто отделить компонент после последней косой черты, вы можете сделать rsplit с maxsplit из 1 и сохранить первый компонент:

>>> 'http://127.0.0.1/asdf/login.php'.rsplit('/', 1)[0]
'http://127.0.0.1/asdf'

Ответ 2

Лучший способ сделать это - использовать urllib.parse.

Из документов:

Модуль был разработан для соответствия RFC в Интернете по относительным унифицированным указателям ресурсов. Он поддерживает следующие схемы URL: file, ftp, gopher, hdl, http, https, imap, mailto, mms, news, nntp, prospero, rsync, rtsp, rtspu, sftp, shttp, sip, sips, snews, svn, svn+ssh, telnet, wais, ws, wss.

Вы хотели бы сделать что-то вроде этого, используя urlsplit и urlunsplit:

from urllib.parse import urlsplit, urlunsplit

split_url = urlsplit('http://127.0.0.1/asdf/login.php?q=abc#stackoverflow')

# You now have:
# split_url.scheme   "http"
# split_url.netloc   "127.0.0.1" 
# split_url.path     "/asdf/login.php"
# split_url.query    "q=abc"
# split_url.fragment "stackoverflow"

# Use all the path except everything after the last '/' 
clean_path = "".join(split_url.path.rpartition("/")[:-1])

# "/asdf/"

# urlunsplit joins a urlsplit tuple
clean_url = urlunsplit(split_url)

# "http://127.0.0.1/asdf/login.php?q=abc#stackoverflow"


# A more advanced example 
advanced_split_url = urlsplit('http://foo:[email protected]:5000/asdf/login.php?q=abc#stackoverflow')

# You now have *in addition* to the above:
# advanced_split_url.username   "foo"
# advanced_split_url.password   "bar"
# advanced_split_url.hostname   "127.0.0.1"
# advanced_split_url.port       "5000"

Ответ 3

Получите самое правильное появление косой черты; используйте строковый срез через эту позицию в исходной строке. +1 дает вам эту последнюю косую черту в конце.

link = "http://127.0.0.1/asdf/login.php"
link[:link.rfind('/')+1]

Ответ 4

Не нужно использовать регулярное выражение, вы можете просто использовать rsplit():

>>> url = 'http://127.0.0.1/asdf/login.php'
>>> url.rsplit('/', 1)[0]
'http://127.0.0.1/asdf'

Ответ 5

Если вы используете python3, вы можете использовать urlparse и urlunparse.

In :from urllib.parse import urlparse, urlunparse

In :url = "http://127.0.0.1/asdf/login.php"

In :result = urlparse(url)

In :new = list(result)

In :new[2] = new[2].replace("login.php", "")

In :urlunparse(new)
Out:'http://127.0.0.1/asdf/'

Ответ 6

Существует самое короткое решение для Python3 с использованием библиотеки urllib (не знаю, быстрее ли):

from urllib.parse import urljoin

base_url = urljoin('http://127.0.0.1/asdf/login.php', '.')
# output: http://127.0.0.1/asdf/

Имейте в виду, что библиотека urllib поддерживает uri/url, совместимый с ключевым словом HTML. Это означает, что uri/url, оканчивающийся на "/", означает другое, чем без, как здесь fooobar.com/info/96676/...:

base_url = urljoin('http://127.0.0.1/asdf/', '.')
# output: http://127.0.0.1/asdf/

base_url = urljoin('http://127.0.0.1/asdf', '.')
# output: http://127.0.0.1/

Это ссылка на urllib для python: https://pythonprogramming.net/urllib-tutorial-python-3/