【问题标题】:How to remove query string from a url?如何从 url 中删除查询字符串?
【发布时间】:2018-12-08 03:59:44
【问题描述】:

我有以下网址:

https://stackoverflow.com/questions/7990301?aaa=aaa
https://stackoverflow.com/questions/7990300?fr=aladdin
https://stackoverflow.com/questions/22375#6
https://stackoverflow.com/questions/22375?
https://stackoverflow.com/questions/22375#3_1

例如,我需要 URL:

https://stackoverflow.com/questions/7990301
https://stackoverflow.com/questions/7990300
https://stackoverflow.com/questions/22375
https://stackoverflow.com/questions/22375
https://stackoverflow.com/questions/22375

我的尝试:

url='https://stackoverflow.com/questions/7990301?aaa=aaa'
if '?' in url:
    url=url.split('?')[0]
if '#' in url:
    url = url.split('#')[0]

我认为这是一种愚蠢的方式

【问题讨论】:

    标签: python url


    【解决方案1】:

    非常有用的库 furl 使得删除查询和片段部分变得微不足道:

    >>> furl.furl("https://hi.com/?abc=def#ghi").remove(args=True, fragment=True).url
    https://hi.com/
    

    【讨论】:

    • 内置Python方式基本一模一样的情况下为什么要下载这个库:from urllib.parse import urlsplit, urlunsplit然后urlunsplit(urlsplit("https://hi.com/?abc=def#ghi")._replace(query="", fragment=""))
    【解决方案2】:

    您可以拆分字符串中不存在的内容,您只会得到一个元素的列表,因此根据您的目标,您可以执行以下操作来简化现有代码:

    url = url.split('?')[0].split('#')[0]
    

    并不是说这是最好的方法(furl 是一个很好的解决方案),但它是一种方法。

    【讨论】:

      【解决方案3】:

      在您的示例中,您还删除了 the fragment (the thing after a #),而不仅仅是 the query

      您可以使用urllib.parse.urlsplit 删除这两者,然后在返回的namedtuple 上调用._replace 并使用urllib.parse.unsplit 转换回字符串URL:

      from urllib.parse import urlsplit, urlunsplit
      
      def remove_query_params_and_fragment(url):
          return urlunsplit(urlsplit(url)._replace(query="", fragment=""))
      

      输出:

      >>> remove_query_params_and_fragment("https://stackoverflow.com/questions/7990301?aaa=aaa")
      'https://stackoverflow.com/questions/7990301'
      >>> remove_query_params_and_fragment("https://stackoverflow.com/questions/7990300?fr=aladdin")
      'https://stackoverflow.com/questions/7990300'
      >>> remove_query_params_and_fragment("https://stackoverflow.com/questions/22375#6")
      'https://stackoverflow.com/questions/22375'
      >>> remove_query_params_and_fragment("https://stackoverflow.com/questions/22375?")
      'https://stackoverflow.com/questions/22375'
      >>> remove_query_params_and_fragment("https://stackoverflow.com/questions/22375#3_1")
      'https://stackoverflow.com/questions/22375'
      

      【讨论】:

        【解决方案4】:

        你可以试试

        urls = ["https://stackoverflow.com/questions/7990301?aaa=aaa",
        "https://stackoverflow.com/questions/7990300?fr=aladdin",
        "https://stackoverflow.com/questions/22375#6",
        "https://stackoverflow.com/questions/22375"?,
        "https://stackoverflow.com/questions/22375#3_1"]
        
        urls_without_query = [url.split('?')[0] for url in urls]
        

        例如,"https://stackoverflow.com/questions/7990301?aaa=aaa".split() 返回一个看起来像["https://stackoverflow.com/questions/7990301", "aaa=aaa"] 的列表,如果该字符串是urlurl.split('?')[0] 将给你"https://stackoverflow.com/questions/7990301"

        编辑:我没有考虑# 参数。其他答案可能对您有更多帮助:)

        【讨论】:

        • 这不会删除片段,并且并不比 OP 希望改进的解决方案更好。
        【解决方案5】:

        您可以使用w3lib

        from w3lib import url as w3_url
        url_without_query = w3_url.url_query_cleaner(url)
        

        【讨论】:

          【解决方案6】:

          这是一个使用标准库的答案,它可以正确解析 URL:

          from urllib.parse import urlparse
          
          url = 'http://www.example.com/this/category?one=two'
          parsed = urlparse(url)
          print("".join([parsed.scheme,"://",parsed.netloc,parsed.path]))
          

          预期输出:

          http://www.example.com/this/category

          注意:这也会去掉参数和片段,但如果你愿意,很容易修改以包含它们。

          【讨论】:

            猜你喜欢
            • 2019-01-14
            • 2011-02-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-07-22
            相关资源
            最近更新 更多