Làm cách nào để lấy mọi thứ sau dấu gạch chéo cuối cùng trong URL?


110

Làm cách nào để trích xuất bất cứ thứ gì sau dấu gạch chéo cuối cùng trong URL bằng Python? Ví dụ: các URL này sẽ trả về như sau:

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

Tôi đã thử urlparse, nhưng điều đó cung cấp cho tôi tên tệp đường dẫn đầy đủ, chẳng hạn như page/page/12345.


1
Nếu URL có thể chứa các chuỗi truy vấn như ...?foo=barvà bạn không muốn điều này; Tôi đề nghị sử dụng urlparsekết hợp với -suggestion của naeg basename.
plundra,

Câu trả lời:


243

Bạn không cần những thứ cầu kỳ, chỉ cần xem các phương thức chuỗi trong thư viện tiêu chuẩn và bạn có thể dễ dàng tách url của mình giữa phần 'tên tệp' và phần còn lại:

url.rsplit('/', 1)

Vì vậy, bạn có thể nhận được phần mà bạn quan tâm chỉ với:

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

10
url.rsplit('/', 1)trả về một danh sách và url.rsplit('/', 1)[-1]là bit sau dấu gạch chéo cuối cùng.
Hugo

5
Một cách khác để làm sẽ là: url.rsplit ( '/', 1) .pop ()
Alex Fortin

CẢNH BÁO: Thủ thuật cơ bản này phá vỡ hoàn toàn trên các URL chẳng hạn như http://www.example.com/foo/?entry=the/bar#another/bar. Nhưng phân tích cú pháp cơ bản như thế nào rsplitlà ổn nếu bạn hoàn toàn chắc chắn sẽ không bao giờ có bất kỳ dấu gạch chéo nào trong truy vấn hoặc tham số phân đoạn của bạn. Tuy nhiên, tôi rùng mình khi nghĩ đến có bao nhiêu cơ sở mã thực sự chứa rsplitmã này và lỗi liên quan đến xử lý truy vấn của nó. Những người muốn AN TOÀN TUYỆT ĐỐI VÀ TIN CẬY nên sử dụng urllib.parse()thay thế! Sau đó, bạn có thể sử dụng pathgiá trị mà nó trả về và chia RẰNG để đảm bảo rằng bạn CHỈ chia đường dẫn.
Mitch McMabers

MÃ: Một ví dụ về cách triển khai phương pháp tốt hơn: from urllib.parse import urlparse; p = urlparse("http://www.example.com/foo.htm?entry=the/bar#another/bar"); print(p.path.rsplit("/", 1)[-1]) Kết quả:foo.htm
Mitch McMabers



10

Bạn có thể làm như sau:

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

Nơi đuôi sẽ là tên tệp của bạn.


6

urlparse có thể sử dụng nếu bạn muốn (giả sử, để loại bỏ bất kỳ tham số chuỗi truy vấn nào).

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

Đầu ra:

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

điều này cũng hoạt động: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:];

quên from string import rfindtừ câu trả lời của bạn
Kimvais

0

partitionrpartitioncũng tiện dụng cho những việc như vậy:

url.rpartition('/')[2]


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

Output: TEST2.


2
Bạn thực sự cần vượt qua -1như chỉ số, nếu không này chỉ hoạt động trên dây với chính xác điều đó nhiều/
Chris_Rands
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.