【问题标题】:Slicing URL with Python使用 Python 对 URL 进行切片
【发布时间】:2010-09-20 12:00:12
【问题描述】:

我正在处理大量 URL。只是一个简单的问题,我试图将 URL 的一部分切掉,见下文:

http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3

我怎么能切出来:

http://www.domainname.com/page?CONTENT_ITEM_ID=1234

有时在 CONTENT_ITEM_ID 之后有两个以上的参数,并且 ID 每次都不同,我认为可以通过找到第一个 & 然后在 & 之前切掉字符来完成,不太清楚如何做到这一点呵呵。

干杯

【问题讨论】:

    标签: python url string


    【解决方案1】:

    使用urlparse 模块。检查此功能:

    import urlparse
    
    def process_url(url, keep_params=('CONTENT_ITEM_ID=',)):
        parsed= urlparse.urlsplit(url)
        filtered_query= '&'.join(
            qry_item
            for qry_item in parsed.query.split('&')
            if qry_item.startswith(keep_params))
        return urlparse.urlunsplit(parsed[:3] + (filtered_query,) + parsed[4:])
    

    在你的例子中:

    >>> process_url(a)
    'http://www.domainname.com/page?CONTENT_ITEM_ID=1234'
    

    如果您决定还需要更多查询参数,或者如果参数的顺序不固定,则此功能更易于使用,如下所示:

    >>> url='http://www.domainname.com/page?other_value=xx&param3&CONTENT_ITEM_ID=1234&param1'
    >>> process_url(url, ('CONTENT_ITEM_ID', 'other_value'))
    'http://www.domainname.com/page?other_value=xx&CONTENT_ITEM_ID=1234'
    

    【讨论】:

      【解决方案2】:

      快速而肮脏的解决方案是这样的:

      >>> "http://something.com/page?CONTENT_ITEM_ID=1234&param3".split("&")[0]
      'http://something.com/page?CONTENT_ITEM_ID=1234'
      

      【讨论】:

        【解决方案3】:

        另一种选择是使用 split 函数,将 & 作为参数。这样,您将同时提取基本 url 和两个参数。

           url.split("&") 
        

        返回一个列表

          ['http://www.domainname.com/page?CONTENT_ITEM_ID=1234', 'param2', 'param3']
        

        【讨论】:

          【解决方案4】:

          我发现下面是我需要做的:

          url = "http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3"
          url = url[: url.find("&")]
          print url
          'http://www.domainname.com/page?CONTENT_ITEM_ID=1234'
          

          【讨论】:

          • 小心这个 - 如果没有参数(没有“&”),它只会从 url 中删除最后一个字符。
          • 请参阅stackoverflow.com/questions/229352/python-find-question 以获得更好的解决方案。
          • 啊,我知道这可能是个问题,感谢您的警告。我使用的列表后面总是有一个参数,但我以后会记住这一点。 :)
          • 小心 url 解析,这在大多数情况下并不像看起来那么容易。你最好使用 urlparse 模块,即使它看起来很简单。
          • @Eef:总是意味着“大部分”。从不意味着“很少”。只要您说“始终”,您就知道它会中断,因为 14,000 人中有 2 人违反了您的“始终”规则。
          【解决方案5】:

          Parsin URL 从来没有看起来那么简单,这就是为什么有 urlparse 和 urllib 模块。

          E.G:

          import urllib
          url ="http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3"
          query = urllib.splitquery(url)
          result = "?".join((query[0], query[1].split("&")[0]))
          print result
          'http://www.domainname.com/page?CONTENT_ITEM_ID=1234'
          

          这仍然不是 100 % 可靠,但比你自己拆分它要多得多,因为有很多你和我不知道的有效 url 格式,有一天会在错误日志中发现。

          【讨论】:

            【解决方案6】:
            import re
            url = 'http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3'
            m = re.search('(.*?)&', url)
            print m.group(1)
            

            【讨论】:

              【解决方案7】:

              查看urllib2 file name 问题以了解有关此主题的一些讨论。

              另请参阅“Python Find Question”问题。

              【讨论】:

                【解决方案8】:

                此方法不依赖于参数在 url 字符串中的位置。我敢肯定,这可以改进,但它明白了重点。

                url = 'http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3'
                parts = url.split('?')
                id = dict(i.split('=') for i in parts[1].split('&'))['CONTENT_ITEM_ID']
                new_url = parts[0] + '?CONTENT_ITEM_ID=' + id
                

                【讨论】:

                  【解决方案9】:

                  一个古老的问题,但我还是想说,查询字符串参数也可以用';'分隔不仅仅是'&'。

                  【讨论】:

                    【解决方案10】:

                    除了urlparse还有furl,它有恕我直言更好的API。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-05-21
                      • 2019-03-17
                      • 1970-01-01
                      • 2020-08-27
                      • 2013-06-21
                      相关资源
                      最近更新 更多