【问题标题】:How to get everything after last slash in a URL?如何在 URL 中的最后一个斜杠之后获取所有内容?
【发布时间】:2011-11-07 09:40:03
【问题描述】:

如何在 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

【问题讨论】:

  • 如果 URL 可能包含像 ...?foo=bar 这样的查询字符串,而您不希望这样;我建议将 urlparse 与 naeg 的 basename-suggestion 结合使用。
  • 网址可以以斜杠结尾。如果您需要http://www.test.com/TEST1/ 来返回TEST1,那么所有这些答案都不适合您。
  • 我有点失望,没有人在他们的例子中使用这个问题的 url :~(
  • @Boris:不再是 - 因为你的回答(现在也是我的)。 ;-)

标签: python parsing url


【解决方案1】:

使用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'

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

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'

【讨论】:

    【解决方案2】:

    以下解决方案使用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'
    

    【讨论】:

      【解决方案3】:

      拆分网址并弹出最后一个元素

      const plants = ['broccoli', 'cauliflower', 'cabbage', 'kale', 'tomato'];
      
      console.log(plants.pop());
      // expected output: "tomato"
      
      console.log(plants);
      // expected output: Array ["broccoli", "cauliflower", "cabbage", "kale"]

      【讨论】:

        【解决方案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'的示例)

        【讨论】:

          【解决方案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}")
          • URLs 不是文件路径,它们可以在路径后包含?query=string#fragment
          【解决方案6】:

          你可以这样做:

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

          tail 将是您的文件名。

          【讨论】:

          • 这不适用于路径分隔符不是“/”的系统。 os.path docs 中的注释之一提到了 posixpath,但我无法在我的系统上导入它:“如果您想操作始终位于其中之一的路径,您也可以导入和使用单个模块不同的格式。它们都具有相同的界面:用于 UNIX 样式路径的 posixpath"
          【解决方案7】:

          这是一种更通用的正则表达式方式:

              re.sub(r'^.+/([^/]+)$', r'\1', url)
          

          【讨论】:

          • 你能解释一下吗?
          【解决方案8】:

          拆分url并弹出最后一个元素 url.split('/').pop()

          【讨论】:

            【解决方案9】:

            您不需要花哨的东西,只需查看the string methods in the standard library,您就可以轻松地将您的网址拆分为“文件名”部分和其余部分:

            url.rsplit('/', 1)
            

            所以你可以简单地得到你感兴趣的部分:

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

            【讨论】:

            • url.rsplit('/', 1) 返回一个列表,url.rsplit('/', 1)[-1] 是最后一个斜杠之后的位。
            • 另一种方法是:url.rsplit('/', 1).pop()
            • 警告: 这个基本技巧在诸如 http://www.example.com/foo/?entry=the/bar#another/bar 这样的 URL 上完全失效。但是,如果您绝对确定查询或片段参数中永远不会有任何斜线,则像 rsplit 这样的基本解析是可以的。但是,想到有多少代码库实际上包含此rsplit 代码及其与查询处理相关的错误,我不寒而栗。 想要绝对安全和可靠的人应该改用urllib.parse()!然后,您可以使用它返回的 path 值并拆分它以确保您只拆分了路径。
            • 代码:如何实现更好方法的示例: 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
            • @Caterpilaraoz 我在这里计算了两个不被接受的答案,这些答案多年来一直表明这一点:)
            【解决方案10】:

            如果您愿意(例如,摆脱任何查询字符串参数),可以使用 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
            

            【讨论】:

            • 使用urlparse 是正确的答案,但如果您的网址以/ 结尾,这将返回""
            • 使用i.rstrip('/')会解决以/结尾时的空路径
            【解决方案11】:
            url ='http://www.test.com/page/TEST2'.split('/')[4]
            print url
            

            输出:TEST2

            【讨论】:

            • 你真的应该将-1 作为索引传递,否则这只适用于正好有那么多/的字符串
            【解决方案12】:

            另一种 (idio(ma)tic) 方式:

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

            【讨论】:

            • 是的,这比使用rsplit 更直接。
            【解决方案13】:
            extracted_url = url[url.rfind("/")+1:];
            

            【讨论】:

              【解决方案14】:

              rsplit 应该可以胜任:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-10-27
                • 2016-07-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-01-25
                相关资源
                最近更新 更多