2010-11-27 65 views

回答

9

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

0
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

67

您可以使用urlsplit()urlunsplit()掰开重建一个URL,然后在解析的查询字符串中使用urlencode()

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

我用它作为分页,它像一个魅力工作。谢谢! – Jabba 2015-06-04 17:21:32

+0

虽然这已经有几年了,但我仍然觉得有必要指出这一点,因为这个问题出现在谷歌搜索的首页:如果你关心参数的顺序(我假设你这样做,因为doseq =真正的部分),你应该使用`parse_qsl()`,而不是`parse_qs()` - 前者返回一个元组列表,而后者返回一个字典,这是**不保证保持顺序当迭代时。然后,可以通过query_params.append((param_name,param_value))`来添加一个参数。 – mhouglum 2017-09-29 17:19:24

0

您可以使用Python:

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)) 

如下使用它url操作库furl

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