【问题标题】:Retrieving parameters from a URL从 URL 检索参数
【发布时间】:2011-07-01 18:45:03
【问题描述】:

给定如下 URL,如何解析查询参数的值?例如,在这种情况下,我想要some_key 的值。

/some_path?some_key=some_value'

我在我的环境中使用 Django; request 对象上是否有可以帮助我的方法?

我尝试使用self.request.get('some_key'),但它没有像我希望的那样返回值some_value

【问题讨论】:

    标签: python django parsing url


    【解决方案1】:

    这不是特定于 Django 的,而是针对一般 Python 的。对于 Django 特定的答案,来自@jball037 的see this one

    Python 2:

    import urlparse
    
    url = 'https://www.example.com/some_path?some_key=some_value'
    parsed = urlparse.urlparse(url)
    captured_value = urlparse.parse_qs(parsed.query)['some_key'][0]
    
    print captured_value
    

    Python 3:

    from urllib.parse import urlparse
    from urllib.parse import parse_qs
    
    url = 'https://www.example.com/some_path?some_key=some_value'
    parsed_url = urlparse(url)
    captured_value = parse_qs(parsed_url.query)['some_key'][0]
    
    print(captured_value)
    

    parse_qs 返回一个列表。 [0] 获取列表的第一项,因此每个脚本的输出为 some_value

    Here's the 'parse_qs' documentation for Python 3

    【讨论】:

    • 在python3中import urllib.parse as urlparse
    • 请注意,parse_qs 将返回一个列表对象。如果你想要一个字符串urlparse.parse_qs(parsed.query)['def'][0],你需要获取它的第一个元素
    • 请注意,如果url包含'#'字符就像这样:foo.appspot.com/#/abc?def=ghi,你必须禁止片段:urlparse(url, allow_fragments=False),否则查询将返回空str。
    • 在python3中,必须使用from urllib.parse import urlparse, parse_qsparse_qs(parsed.query)
    • @FrancescoFrassinelli 它是有效的。 urlparse.urlparse(url) --> urlparse(url)
    【解决方案2】:

    我很震惊这里还没有这个解决方案。使用:

    request.GET.get('variable_name')
    

    这将从“GET”字典中“获取”变量,如果存在则返回“variable_name”值,如果不存在则返回 None 对象。

    【讨论】:

    • 这应该是最佳答案。像魅力一样工作。
    • 我不得不放弃self,但我同意上述评论。
    • 我无法让它工作。也许更多的细节。你怎么得到请求?这个python3兼容吗?
    • @ggedde 这个答案(就像问题一样)适用于 django,它是一个 django 请求对象。如果您不使用 django,请使用其他答案之一。
    • def parse_category_page(self, response): product_id = response.GET.get('number') 不起作用,请求也不起作用
    【解决方案3】:

    对于 Python > 3.4

    from urllib import parse
    url = 'http://foo.appspot.com/abc?def=ghi'
    query_def=parse.parse_qs(parse.urlparse(url).query)['def'][0]
    

    【讨论】:

    • IMO 的最佳做法。不需要额外的包并且在 Python 3.5 上工作 A+。
    【解决方案4】:
    import urlparse
    url = 'http://example.com/?q=abc&p=123'
    par = urlparse.parse_qs(urlparse.urlparse(url).query)
    
    print par['q'][0], par['p'][0]
    

    【讨论】:

      【解决方案5】:

      有一个名为 furl 的新库。我发现这个库最适合做 url 代数。 安装:

      pip install furl
      

      代码:

      from furl import furl
      f = furl("/abc?def='ghi'") 
      print f.args['def']
      

      【讨论】:

      • 很棒的图书馆!不知道,但它就像一个魅力:)
      • :) 我浪费了我的时间来尝试让 urlparse 为我工作。没有了。
      【解决方案6】:

      我知道这有点晚了,但自从我今天发现自己在这里,我认为这对其他人可能是一个有用的答案。

      import urlparse
      url = 'http://example.com/?q=abc&p=123'
      parsed = urlparse.urlparse(url)
      params = urlparse.parse_qsl(parsed.query)
      for x,y in params:
          print "Parameter = "+x,"Value = "+y
      

      使用 parse_qsl(),“数据以名称、值对列表的形式返回。”

      【讨论】:

        【解决方案7】:

        您引用的 url 是一个查询类型,我看到请求对象支持一种名为 arguments 的方法来获取查询参数。您可能还想直接尝试self.request.get('def') 以从对象中获取您的价值..

        【讨论】:

          【解决方案8】:
          def getParams(url):
              params = url.split("?")[1]
              params = params.split('=')
              pairs = zip(params[0::2], params[1::2])
              answer = dict((k,v) for k,v in pairs)
          

          希望对你有帮助

          【讨论】:

          • 这在 webapp 中不应该是必需的。
          【解决方案9】:

          在纯 Python 中:

          def get_param_from_url(url, param_name):
              return [i.split("=")[-1] for i in url.split("?", 1)[-1].split("&") if i.startswith(param_name + "=")][0]
          

          【讨论】:

            【解决方案10】:

            urlparse 模块提供你需要的一切:

            urlparse.parse_qs()

            【讨论】:

            • 此答案是否提供其他答案未提供的任何内容?
            【解决方案11】:

            没有必要这样做。仅与

            self.request.get('variable_name')
            

            请注意,我没有指定方法(GET、POST 等)。这是well documentedthis is an example

            您使用 Django 模板这一事实并不意味着处理程序也由 Django 处理

            【讨论】:

              【解决方案12】:
              import cgitb
              cgitb.enable()
              
              import cgi
              print "Content-Type: text/plain;charset=utf-8"
              print
              form = cgi.FieldStorage()
              i = int(form.getvalue('a'))+int(form.getvalue('b'))
              print i
              

              【讨论】:

                【解决方案13】:

                有一个不错的库 w3lib.url

                from w3lib.url import url_query_parameter
                url = "/abc?def=ghi"
                print url_query_parameter(url, 'def')
                ghi
                

                【讨论】:

                  【解决方案14】:

                  这里的大多数答案建议使用 parse_qs 来解析 URL 字符串。此方法总是将值作为列表返回(而不是直接作为字符串),因为一个参数可以出现多次,例如:

                  http://example.com/?foo=bar&foo=baz&bar=baz

                  会返回:

                  {'foo': ['bar', 'baz'], 'bar' : ['baz']}

                  这有点不方便,因为在大多数情况下,您要多次处理一个没有相同参数的 URL。该函数默认返回第一个值,如果有多个元素,则只返回一个列表。

                  from urllib import parse
                  
                  def parse_urlargs(url):
                      query = parse.parse_qs(parse.urlparse(url).query)
                      return {k:v[0] if v and len(v) == 1 else v for k,v in query.items()}
                  

                  例如,http://example.com/?foo=bar&foo=baz&bar=baz 会返回:

                  {'foo': ['bar', 'baz'], 'bar': 'baz'}

                  【讨论】:

                    【解决方案15】:

                    顺便说一句,我在使用 parse_qs() 并获取空值参数时遇到问题,并了解到您必须传递第二个可选参数“keep_blank_values”才能返回查询字符串中不包含值的参数列表。它默认为假。一些蹩脚的 API 要求参数存在,即使它们不包含值

                    for k,v in urlparse.parse_qs(p.query, True).items():
                      print k
                    

                    【讨论】:

                      【解决方案16】:

                      parameters = dict([part.split('=') for part in get_parsed_url[4].split('&')])

                      这个很简单。可变参数将包含所有参数的字典。

                      【讨论】:

                        【解决方案17】:

                        我发现 Tornado 用户没有答案:

                        key = self.request.query_arguments.get("key", None)
                        

                        此方法必须在派生自的处理程序内工作:

                        tornado.web.RequestHandler
                        

                        None 是当找不到请求的密钥时此方法将返回的答案。这为您节省了一些异常处理。

                        【讨论】:

                          【解决方案18】:

                          我不想弄乱其他库。这里建议的简单方法也没有奏效。最后,不是在请求对象上,但我可以通过self.GET.get('XXX') 获得一个 GET 参数而无需任何麻烦:

                          ...
                          def get_context_data(self, **kwargs):
                              context = super(SomeView, self).get_context_data(**kwargs)
                              context['XXX'] = self.GET.get('XXX')
                          ...
                          

                          Python 2.7.18、Django 1.11.20

                          【讨论】:

                            【解决方案19】:

                            不使用 Django 并在 Python 3.9 上尝试过。也可以在处理程序中使用以下代码 sn-p 检索它:

                            考虑 URL 为-

                            http://localhost:8081/api/v1/users?query_key=abcdef12345
                            

                            和处理方法为:

                            @routes.get('/api/v1/users')
                            async def handler_users(request):
                                query_key = request.url.query['query_key']
                            

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2013-06-27
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多