【问题标题】:How to add custom parameters to an URL query string with Python?如何使用 Python 将自定义参数添加到 URL 查询字符串?
【发布时间】:2011-05-16 15:50:54
【问题描述】:

我需要使用 Python 将自定义参数添加到 URL 查询字符串

示例: 这是浏览器正在获取 (GET) 的 URL:

/scr.cgi?q=1&ln=0

然后执行一些python命令,因此我需要在浏览器中设置以下URL:

/scr.cgi?q=1&ln=0&SOMESTRING=1

有一些标准方法吗?

【问题讨论】:

标签: python


【解决方案1】:

您可以使用urlsplit()urlunsplit() 拆分并重建一个URL,然后在解析的查询字符串上使用urlencode()

from urllib import urlencode
from urlparse import parse_qs, urlsplit, urlunsplit

def set_query_parameter(url, param_name, param_value):
    """Given a URL, set or replace a query parameter and return the
    modified URL.

    >>> set_query_parameter('http://example.com?foo=bar&biz=baz', 'foo', 'stuff')
    'http://example.com?foo=stuff&biz=baz'

    """
    scheme, netloc, path, query_string, fragment = urlsplit(url)
    query_params = parse_qs(query_string)

    query_params[param_name] = [param_value]
    new_query_string = urlencode(query_params, doseq=True)

    return urlunsplit((scheme, netloc, path, new_query_string, fragment))

如下使用:

>>> set_query_parameter("/scr.cgi?q=1&ln=0", "SOMESTRING", 1)
'/scr.cgi?q=1&ln=0&SOMESTRING=1'

【讨论】:

  • 虽然这已经有好几年了,但我仍然觉得有必要指出这一点,因为这个问题出现在谷歌搜索的首页上:如果你关心参数的顺序(我假设你这样做, 因为doseq=True 部分),你应该使用parse_qsl(),而不是parse_qs()——前者返回一个元组列表,而后者返回一个dict,它不是保证在迭代时保持顺序。然后,可以通过query_params.append((param_name, param_value)) 添加参数。
【解决方案2】:

使用urlsplit() 提取查询字符串,parse_qsl() 解析它(或parse_qs(),如果您不关心参数顺序),添加新参数urlencode() 将其转回查询字符串,urlunsplit() 将其融合回单个 URL,然后重定向客户端。

【讨论】:

    【解决方案3】:

    你可以使用python的url操作库furl

    import furl
    f =  furl.furl("/scr.cgi?q=1&ln=0")  
    f.args['SOMESTRING'] = 1
    print(f.url)
    

    【讨论】:

    • 看来 furl 不是内置模块,所以需要先安装。
    【解决方案4】:
    import urllib
    url = "/scr.cgi?q=1&ln=0"
    param = urllib.urlencode({'SOME&STRING':1})
    url = url.endswith('&') and (url + param) or (url + '&' + param)
    

    the docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-20
      • 2019-09-20
      • 2020-02-04
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多