Як отримати все після останньої косої риски в 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.
плюндра

Відповіді:


243

Вам не потрібні химерні речі, просто перегляньте рядкові методи у стандартній бібліотеці, і ви можете легко розділити URL-адресу на частину 'filename' та решту:

url.rsplit('/', 1)

Таким чином, ви можете отримати частину, яка вас цікавить, просто за допомогою:

url.rsplit('/', 1)[-1]

10
url.rsplit('/', 1)повертає список і url.rsplit('/', 1)[-1]є бітом після останньої косої риски.
Гюго

5
Ще один спосіб зробити це: url.rsplit ('/', 1) .pop ()
Алекс Фортін

ПОПЕРЕДЖЕННЯ. Цей основний трюк повністю порушується на такі 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
Мітч Макмаберс




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.