จะรับทุกอย่างหลังจากสแลชสุดท้ายใน URL ได้อย่างไร


110

ฉันจะแยกสิ่งที่ตามหลังเครื่องหมายทับสุดท้ายใน URL ใน Python ได้อย่างไร ตัวอย่างเช่น URL เหล่านี้ควรส่งคืนสิ่งต่อไปนี้:

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

ฉันได้ลอง urlparse แล้ว แต่นั่นทำให้ฉันมีชื่อไฟล์พา ธ แบบเต็มเช่นpage/page/12345.


1
หาก URL อาจมีสตริงคำค้นหา...?foo=barและคุณไม่ต้องการสิ่งนี้ ฉันขอแนะนำให้ใช้urlparseร่วมกับคำbasenameแนะนำของ naeg
plundra

คำตอบ:


243

คุณไม่จำเป็นต้องมีอะไรแปลก ๆ เพียงดูวิธีการสตริงในไลบรารีมาตรฐานและคุณสามารถแยก url ของคุณระหว่างส่วน 'ชื่อไฟล์' และส่วนที่เหลือได้อย่างง่ายดาย:

url.rsplit('/', 1)

ดังนั้นคุณสามารถมีส่วนที่คุณสนใจได้ง่ายๆด้วย:

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

10
url.rsplit('/', 1)ส่งคืนรายการและurl.rsplit('/', 1)[-1]เป็นบิตหลังเครื่องหมายทับสุดท้าย
Hugo

5
อีกวิธีหนึ่งคือ url.rsplit ('/', 1) .pop ()
Alex Fortin

คำเตือน:เคล็ดลับพื้นฐานนี้แบ่ง URL อย่างสมบูรณ์เช่นhttp://www.example.com/foo/?entry=the/bar#another/bar. แต่การแยกวิเคราะห์พื้นฐานเช่นrsplitนี้ก็ใช้ได้หากคุณมั่นใจอย่างแน่นอนว่าจะไม่มีเครื่องหมายทับในแบบสอบถามหรือพารามิเตอร์แฟรกเมนต์ของคุณ อย่างไรก็ตามฉันรู้สึกสั่นเมื่อนึกถึงจำนวนโค้ดเบสที่มีrsplitรหัสนี้จริงและจุดบกพร่องที่เกี่ยวข้องกับการจัดการแบบสอบถาม คนที่ต้องการความปลอดภัยและความน่าเชื่อถืออย่างแท้จริงควรใช้urllib.parse()แทน! จากนั้นคุณสามารถใช้pathค่าที่ส่งคืนและแยกค่านั้นเพื่อให้แน่ใจว่าคุณแยกเฉพาะเส้นทางเท่านั้น
Mitch McMabers

CODE: ตัวอย่างวิธีการใช้งานวิธีที่ดีกว่า: from urllib.parse import urlparse; p = urlparse("http://www.example.com/foo.htm?entry=the/bar#another/bar"); print(p.path.rsplit("/", 1)[-1])ผลลัพธ์:foo.htm
Mitch McMabers



10

คุณสามารถทำได้ดังนี้:

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

หางจะเป็นชื่อไฟล์ของคุณ


6

urlparse ใช้ได้ดีถ้าคุณต้องการ (เช่นเพื่อกำจัดพารามิเตอร์สตริงการสืบค้น)

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

เอาท์พุต:

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

สิ่งนี้ยังใช้งานได้:from pathlib import Path print(f"Path(redirected_response.url).stem: {Path(redirected_response.url).stem!r}")
Alex Glukhovtsev



0

partitionและrpartitionยังมีประโยชน์สำหรับสิ่งเหล่านี้:

url.rpartition('/')[2]


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

เอาท์พุต: TEST2.


2
คุณควรส่งผ่าน-1เป็นดัชนีมิฉะนั้นจะใช้ได้กับสตริงที่มีจำนวนมากเท่านั้น/
Chris_Rands
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.