Как получить все после последней косой черты в URL-адресе?

110

Как я могу извлечь все, что следует за последней косой чертой в URL-адресе в Python? Например, эти URL-адреса должны возвращать следующее:

URL: http://www.test.com/TEST1
returns: TEST1

URL: http://www.test.com/page/TEST2
returns: TEST2

URL: http://www.test.com/page/page/12345
returns: 12345

Я пробовал urlparse, но это дает мне полный путь к имени файла, например page/page/12345.

смешивание
источник
1
Если URL-адрес может содержать такие строки запроса, как, ...?foo=barа вам это не нужно; Я бы предложил использовать urlparseв сочетании с -предложением basenameNaeg.
plundra

Ответы:

243

Вам не нужны причудливые вещи, просто просмотрите строковые методы в стандартной библиотеке, и вы можете легко разделить свой URL-адрес между частью имени файла и остальными:

url.rsplit('/', 1)

Таким образом, вы можете получить интересующую вас деталь с помощью:

url.rsplit('/', 1)[-1]
Люк 404
источник
10
url.rsplit('/', 1)возвращает список, и url.rsplit('/', 1)[-1]это бит после последней косой черты.
Hugo
5
Другой способ сделать это: url.rsplit ('/', 1) .pop ()
Alex
ВНИМАНИЕ: этот базовый прием полностью не работает с URL-адресами, такими как http://www.example.com/foo/?entry=the/bar#another/bar. Но базовый синтаксический анализ rsplit- это нормально, если вы абсолютно уверены, что в вашем запросе или параметрах фрагмента никогда не будет косой черты. Однако мне не терпится подумать о том, сколько баз кода на самом деле содержат этот rsplitкод и связанную с ним ошибку с обработкой запросов. Люди, которые хотят АБСОЛЮТНОЙ БЕЗОПАСНОСТИ И НАДЕЖНОСТИ, должны использовать urllib.parse()вместо этого! Затем вы можете использовать pathвозвращаемое значение и разделить ТО, чтобы убедиться, что вы разделили ТОЛЬКО путь.
Митч МакМаберс
КОД: Пример того, как реализовать лучший метод: from urllib.parse import urlparse; p = urlparse("http://www.example.com/foo.htm?entry=the/bar#another/bar"); print(p.path.rsplit("/", 1)[-1]) Результат:foo.htm
Митч МакМаберс
70

Еще один (идио (ма) тик) способ:

URL.split("/")[-1]
Kimvais
источник
Да, это проще, чем использовать rsplit.
Ян Кю Пеблик, 06
14

rsplit должен соответствовать задаче:

In [1]: 'http://www.test.com/page/TEST2'.rsplit('/', 1)[1]
Out[1]: 'TEST2'
Бенджамин Вольвенд
источник
10

Сделать можно так:

head, tail = os.path.split(url)

Где хвост будет вашим именем файла.

Neowinston
источник
6

urlparse можно использовать, если вы хотите (скажем, чтобы избавиться от любых параметров строки запроса).

import urllib.parse

urls = [
    'http://www.test.com/TEST1',
    'http://www.test.com/page/TEST2',
    'http://www.test.com/page/page/12345',
    'http://www.test.com/page/page/12345?abc=123'
]

for i in urls:
    url_parts = urllib.parse.urlparse(i)
    path_parts = url_parts[2].rpartition('/')
    print('URL: {}\nreturns: {}\n'.format(i, path_parts[2]))

Вывод:

URL: http://www.test.com/TEST1
returns: TEST1

URL: http://www.test.com/page/TEST2
returns: TEST2

URL: http://www.test.com/page/page/12345
returns: 12345

URL: http://www.test.com/page/page/12345?abc=123
returns: 12345
Джейкоб Ван
источник
5
os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
>>> folderD
Рочан
источник
это тоже работает:from pathlib import Path print(f"Path(redirected_response.url).stem: {Path(redirected_response.url).stem!r}")
Алексей Глуховцев
3

Вот более общий способ сделать это с помощью регулярного выражения:

    re.sub(r'^.+/([^/]+)$', r'\1', url)
Sandoronodi
источник
можешь немного объяснить?
Revolucion для Моники
2
extracted_url = url[url.rfind("/")+1:];
фарджад
источник
забыл from string import rfindиз вашего ответа
Kimvais
0

partitionа rpartitionтакже пригодятся для таких вещей:

url.rpartition('/')[2]
цот
источник
0

Разделите URL-адрес и вставьте последний элемент url.split('/').pop()

Атул Ядав
источник
-1
url ='http://www.test.com/page/TEST2'.split('/')[4]
print url

Выход: TEST2.

жить в одиночестве
источник
2
Вы действительно должны передать его -1в качестве индекса, иначе это работает только для строк с таким количеством/
Chris_Rands