Bagaimana cara mendapatkan semuanya setelah garis miring terakhir di URL?

110

Bagaimana saya bisa mengekstrak apapun yang mengikuti garis miring terakhir di URL dengan Python? Misalnya, URL ini harus mengembalikan yang berikut:

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

Saya sudah mencoba urlparse, tetapi itu memberi saya nama file jalur lengkap, seperti page/page/12345.

campuran
sumber
1
Jika URL mungkin berisi string kueri seperti ...?foo=bardan Anda tidak menginginkannya; Saya akan menyarankan penggunaan urlparsedalam kombinasi dengan saran naeg basename.
plundra

Jawaban:

243

Anda tidak perlu hal-hal mewah, cukup lihat metode string di perpustakaan standar dan Anda dapat dengan mudah membagi url Anda antara bagian 'nama file' dan yang lainnya:

url.rsplit('/', 1)

Jadi Anda bisa mendapatkan bagian yang Anda minati hanya dengan:

url.rsplit('/', 1)[-1]
Lukas 404
sumber
10
url.rsplit('/', 1)mengembalikan daftar, dan url.rsplit('/', 1)[-1]merupakan bit setelah garis miring terakhir.
Hugo
5
Cara lain untuk melakukannya adalah: url.rsplit ('/', 1) .pop ()
Alex Fortin
PERINGATAN: Trik dasar ini rusak sepenuhnya pada URL seperti http://www.example.com/foo/?entry=the/bar#another/bar. Tetapi penguraian dasar seperti rsplittidak masalah jika Anda benar-benar yakin tidak akan pernah ada garis miring dalam parameter kueri atau fragmen Anda. Namun, saya ngeri memikirkan berapa banyak basis kode yang sebenarnya berisi rsplitkode ini dan bug yang terkait dengan penanganan kueri. Orang yang menginginkan KEAMANAN DAN KEANDALAN MUTLAK harus menggunakan urllib.parse()! Anda kemudian dapat menggunakan pathnilai yang dikembalikan dan memisahkan ITU untuk memastikan bahwa Anda HANYA memisahkan jalur.
Mitch McMabers
KODE: Contoh bagaimana menerapkan metode yang lebih baik: from urllib.parse import urlparse; p = urlparse("http://www.example.com/foo.htm?entry=the/bar#another/bar"); print(p.path.rsplit("/", 1)[-1]) Hasil:foo.htm
Mitch McMabers
70

Satu cara lagi (idio (ma) tic):

URL.split("/")[-1]
Kimvais
sumber
Ya, ini lebih mudah daripada menggunakan rsplit.
Jan Kyu Peblik
14

rsplit harus sesuai dengan tugas:

In [1]: 'http://www.test.com/page/TEST2'.rsplit('/', 1)[1]
Out[1]: 'TEST2'
Benjamin Wohlwend
sumber
10

Anda bisa melakukan seperti ini:

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

Dimana ekor akan menjadi nama file Anda.

neowinston
sumber
6

urlparse dapat digunakan jika Anda ingin (katakanlah, untuk menghapus parameter string kueri).

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

Keluaran:

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
sumber
5
os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
>>> folderD
Rochan
sumber
ini juga bekerja:from pathlib import Path print(f"Path(redirected_response.url).stem: {Path(redirected_response.url).stem!r}")
Alex Glukhovtsev
3

Berikut cara regex yang lebih umum untuk melakukan ini:

    re.sub(r'^.+/([^/]+)$', r'\1', url)
sandoronodi.dll
sumber
bisakah kamu menjelaskannya sedikit?
Revolucion untuk Monica
2
extracted_url = url[url.rfind("/")+1:];
fardjad
sumber
lupa from string import rfinddari jawaban Anda
Kimvais
0

partitiondan rpartitionjuga berguna untuk hal-hal seperti:

url.rpartition('/')[2]
tzot.dll
sumber
0

Pisahkan url dan pop elemen terakhir url.split('/').pop()

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

Output: TEST2.

hidup sendiri
sumber
2
Anda benar-benar harus lulus -1sebagai indeks, jika tidak ini hanya berfungsi pada string dengan jumlah persis sebanyak itu/
Chris_Rands