Как получить все после последней косой черты в 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]

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
Митч МакМаберс



10

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

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

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


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




0

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

url.rpartition('/')[2]


-1
url ='http://www.test.com/page/TEST2'.split('/')[4]
print url

Выход: TEST2.


2
Вы действительно должны передать его -1в качестве индекса, иначе это работает только для строк с таким количеством/
Chris_Rands
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.