Как я могу получить базу 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/