如何使用Python将自定义参数添加到URL查询字符串?

J.O*_*sen 26 python

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

示例:这是浏览器提取的URL(GET):

/scr.cgi?q=1&ln=0
Run Code Online (Sandbox Code Playgroud)

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

/scr.cgi?q=1&ln=0&SOMESTRING=1
Run Code Online (Sandbox Code Playgroud)

有一些标准方法吗?

Wil*_*hes 68

您可以使用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))
Run Code Online (Sandbox Code Playgroud)

使用方法如下:

>>> set_query_parameter("/scr.cgi?q=1&ln=0", "SOMESTRING", 1)
'/scr.cgi?q=1&ln=0&SOMESTRING=1'
Run Code Online (Sandbox Code Playgroud)

  • 虽然这已经有好几年了,但我仍然觉得有必要指出这一点,因为这个问题出现在谷歌搜索的首页上:如果你关心参数的顺序(我假设你这样做,因为 `doseq=True ` 部分),您应该使用 `parse_qsl()`,而不是 `parse_qs()` —— 前者返回元组列表,而后者返回一个字典,**不**保证在以下情况下保留顺序:迭代了一遍。然后,可以通过“query_params.append((param_name, param_value))”添加参数。 (2认同)

Ign*_*ams 9

使用urlsplit()提取的查询字符串,parse_qsl()分析它(或者parse_qs(),如果你不关心参数顺序),添加新的说法,urlencode()把它放回一个查询字符串,urlunsplit()融合回成一个单一的URL,然后重定向客户端.