Jak uzyskać wszystko po ostatnim ukośniku w adresie URL?


110

Jak mogę wyodrębnić wszystko, co następuje po ostatnim ukośniku w adresie URL w Pythonie? Na przykład te adresy URL powinny zwracać:

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

Próbowałem urlparse, ale to daje mi pełną nazwę pliku ścieżki, na przykład page/page/12345.


1
Jeśli adres URL może zawierać kwerendy, takie jak ...?foo=bari nie chcesz tego; Sugerowałbym użycie urlparsew połączeniu z sugestią basenameNaeg.
plundra

Odpowiedzi:


243

Nie potrzebujesz wymyślnych rzeczy, po prostu zobacz metody ciągów w standardowej bibliotece i możesz łatwo podzielić swój adres URL między część „nazwa pliku” a resztę:

url.rsplit('/', 1)

Aby uzyskać interesującą Cię część, po prostu:

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

10
url.rsplit('/', 1)zwraca listę i url.rsplit('/', 1)[-1]jest bitem po ostatnim ukośniku.
Hugo

5
Innym sposobem byłoby: url.rsplit ('/', 1) .pop ()
Alex Fortin

OSTRZEŻENIE: ta podstawowa sztuczka całkowicie nie działa w przypadku adresów URL, takich jak http://www.example.com/foo/?entry=the/bar#another/bar. Ale podstawowe parsowanie, takie jak, rsplitjest w porządku, jeśli masz absolutną pewność, że nigdy nie będzie żadnych ukośników w zapytaniu lub parametrach fragmentów. Wzdrygam się jednak na myśl o tym, ile baz kodu faktycznie zawiera ten rsplitkod i związany z nim błąd w obsłudze zapytań. Osoby, które chcą ABSOLUTNEGO BEZPIECZEŃSTWA I NIEZAWODNOŚCI, powinny urllib.parse()zamiast tego używać ! Następnie możesz użyć pathzwracanej wartości i podzielić TO, aby mieć pewność, że podzieliłeś TYLKO ścieżkę.
Mitch McMabers

KOD: Przykład wdrożenia lepszej metody: from urllib.parse import urlparse; p = urlparse("http://www.example.com/foo.htm?entry=the/bar#another/bar"); print(p.path.rsplit("/", 1)[-1]) Wynik:foo.htm
Mitch McMabers



10

Możesz zrobić tak:

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

Gdzie tail będzie nazwą twojego pliku.


6

urlparse jest w porządku w użyciu, jeśli chcesz (powiedzmy, aby pozbyć się parametrów ciągu zapytania).

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]))

Wynik:

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

to również działa:from pathlib import Path print(f"Path(redirected_response.url).stem: {Path(redirected_response.url).stem!r}")
Alex Glukhovtsev



0

partitioni rpartitionsą również przydatne do takich rzeczy:

url.rpartition('/')[2]


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.