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.


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]

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



10

Anda bisa melakukan seperti ini:

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

Dimana ekor akan menjadi nama file Anda.


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

5
os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
>>> folderD

ini juga bekerja:from pathlib import Path print(f"Path(redirected_response.url).stem: {Path(redirected_response.url).stem!r}")
Alex Glukhovtsev


2
extracted_url = url[url.rfind("/")+1:];

lupa from string import rfinddari jawaban Anda
Kimvais

0

partitiondan rpartitionjuga berguna untuk hal-hal seperti:

url.rpartition('/')[2]


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

Output: TEST2.


2
Anda benar-benar harus lulus -1sebagai indeks, jika tidak ini hanya berfungsi pada string dengan jumlah persis sebanyak itu/
Chris_Rands
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.