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.

mieszać
źródło
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]
Łukasza404
źródło
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
70

Jeszcze jeden (idio (ma) tic) sposób:

URL.split("/")[-1]
Kimvais
źródło
Tak, jest to prostsze niż używanie rsplit.
Jan Kyu Peblik
14

rsplit powinien sprostać zadaniu:

In [1]: 'http://www.test.com/page/TEST2'.rsplit('/', 1)[1]
Out[1]: 'TEST2'
Benjamin Wohlwend
źródło
10

Możesz zrobić tak:

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

Gdzie tail będzie nazwą twojego pliku.

neowinston
źródło
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
Jacob Wan
źródło
5
os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
>>> folderD
Rochan
źródło
to również działa:from pathlib import Path print(f"Path(redirected_response.url).stem: {Path(redirected_response.url).stem!r}")
Alex Glukhovtsev
3

Oto bardziej ogólny, regexowy sposób na zrobienie tego:

    re.sub(r'^.+/([^/]+)$', r'\1', url)
sandoronodi
źródło
czy możesz to trochę wyjaśnić?
Revolucion dla Moniki
2
extracted_url = url[url.rfind("/")+1:];
fardjad
źródło
zapomniałem from string import rfindodpowiedzi
Kimvais
0

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

url.rpartition('/')[2]
tzot
źródło
0

Podziel adres URL i wstaw ostatni element url.split('/').pop()

Atul Yadav
źródło
-1
url ='http://www.test.com/page/TEST2'.split('/')[4]
print url

Wyjście: TEST2.

żyć samotnie
źródło
2
Naprawdę powinieneś -1/
podać