如何获取URL中最后一个斜杠后的所有内容?

166

我该如何在Python中提取URL中最后一个斜杆之后的内容?例如,这些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


2
如果URL可能包含查询字符串,例如...?foo=bar,而你不想要这个,我建议使用urlparse与Naeg的basename建议相结合。 - plundra
http://docs.python.org/library/urlparse.html#module-urlparse - Rusty Rob
URL可以以斜杠结尾。如果您需要http://www.test.com/TEST1/返回TEST1,那么所有这些答案都不适用于您。 - user3064538
我有点失望,没有人在他们的示例中使用这个问题的URL :~( - Josie Thompson
@Boris:不再了-自从你的回答(现在也包括我的)。;-) - lcnittl
15个回答

345
你不需要花哨的东西,只需查看标准库中的字符串方法,就可以轻松地将您的URL分成“文件名”部分和其余部分:
url.rsplit('/', 1)

因此,您只需使用以下方法即可获取您感兴趣的部分:

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

17
url.rsplit('/', 1) иҝ”еӣһдёҖдёӘеҲ—иЎЁпјҢurl.rsplit('/', 1)[-1] жҳҜжңҖеҗҺдёҖдёӘж–ңжқ еҗҺйқўзҡ„йғЁеҲҶгҖӮ - Hugo
5
另一种方法是:url.rsplit('/', 1).pop()。 - Alex Fortin
21
警告: 这种基本技巧在处理如 http://www.example.com/foo/?entry=the/bar#another/bar 等 URL 时会完全失效。但是,如果您绝对确定查询或片段参数中不会有任何斜杠,那么像 rsplit 这样的基本解析方法是可以的。然而,想到有多少代码库实际上包含了这个 rsplit 代码及其与查询处理相关的缺陷,我就感到惊恐不已了。希望得到绝对安全和可靠性的人应该使用 urllib.parse()!您可以使用它返回的 path 值并将其拆分以确保您仅拆分了路径。 - Mitch McMabers
14
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
@MitchMcMabers,请将此转换为答案(然后应该接受它)。 - Caterpillaraoz
1
@Caterpillaraoz,我数了一下这里有两个未被接受的答案,多年来它们一直建议这样做 :) - tzot

94

还有一种(癖好)方式:

URL.split("/")[-1]

3
比使用“rsplit”更直接。 - Jan Kyu Peblik
加一分给那个有趣的评论哈哈 - Jacky Supit

16

rsplit可以胜任此任务:

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

14

如果您想要使用它来消除任何查询字符串参数,那么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

2
使用urlparse是正确的方法,但如果您的URL以 / 结尾,它会返回 "" - user3064538
2
使用 i.rstrip('/') 可以解决以 / 结尾的空路径问题。 - neves

13
你可以这样做:
head, tail = os.path.split(url)

文件名将是尾部。


1
这在路径分隔符不是“/”的系统上无法工作。 os.path [docs](https://docs.python.org/3/library/os.path.html)中的一个注释提到了posixpath,但我无法在我的系统上导入它:“如果您想操作始终处于不同格式之一的路径,则还可以导入并使用各个模块。它们都具有相同的接口:UNIX风格路径的posixpath”。 - aschmied

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

>>> folderD

1
这也可以工作:print(f"Path(redirected_response.url).stem: {Path(redirected_response.url).stem!r}")``` - Alex Glukhovtsev
URL(https://tools.ietf.org/html/rfc3986#section-3)不是文件路径,它们可以在路径后面包含“?query=string”或“#fragment”。 - user3064538

5
这是一种更通用的正则表达式方法来实现这个功能:
    re.sub(r'^.+/([^/]+)$', r'\1', url)

1
你能稍微解释一下吗? - Revolucion for Monica
@sandoronodi。感谢您的解决方案。如果URL嵌入在一个长字符串中,那么我该如何保留最后一个“/”之后的信息呢?谢谢。 - Sophia

4
首先从URL中提取路径元素:
from urllib.parse import urlparse
parsed= urlparse('https://www.dummy.example/this/is/PATH?q=/a/b&r=5#asx')

然后您可以使用字符串函数提取最后一个片段:

parsed.path.rpartition('/')[2]

(将结果显示为'PATH'的示例)

1
或者我们可以使用 parsed.path.rpartition('/')[-1] 来获取最后一段。 - Franz Wong
1
.partition 始终返回由三个元素组成的元组,因此 [-1] 等同于 [2] - tzot

4

使用urlparse仅获取路径,然后在从中获取的路径上使用/字符分割(split)

from urllib.parse import urlparse

my_url = "http://example.com/some/path/last?somequery=param"
last_path_fragment = urlparse(my_url).path.split('/')[-1]  # returns 'last'

注意:如果您的URL以字符/结尾,则以上将返回''(即空字符串)。如果您想以不同方式处理该情况,您需要在分割路径之前去除最后一个尾随的/字符:

my_url = "http://example.com/last/"
# handle URL ending in `/` by removing it.
last_path_fragment = urlparse(my_url).path.rstrip('/', 1).split('/')[-1]  # returns 'last'

3
以下解决方案使用 pathlib 解析从 urllib.parse 获得的路径,即使终端斜杠存在,也可以获取最后一部分:
import urllib.parse
from pathlib import Path

urls = [
    "http://www.test.invalid/demo",
    "http://www.test.invalid/parent/child",
    "http://www.test.invalid/terminal-slash/",
    "http://www.test.invalid/query-params?abc=123&works=yes",
    "http://www.test.invalid/fragment#70446893",
    "http://www.test.invalid/has/all/?abc=123&works=yes#70446893",
]

for url in urls:
    url_path = Path(urllib.parse.urlparse(url).path)
    last_part = url_path.name  # use .stem to cut file extensions
    print(f"{last_part=}")

产出:

last_part='demo'
last_part='child'
last_part='terminal-slash'
last_part='query-params'
last_part='fragment'
last_part='all'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接