30

I need to add custom parameters to an URL query string using Python

Example: This is the URL that the browser is fetching (GET):

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

then some python commands are executed, and as a result I need to set following URL in the browser:

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

Is there some standard approach?

1

4 Answers 4

72

You can use urlsplit() and urlunsplit() to break apart and rebuild a URL, then use urlencode() on the parsed query string:

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

Use it as follows:

>>> set_query_parameter("/scr.cgi?q=1&ln=0", "SOMESTRING", 1)
'/scr.cgi?q=1&ln=0&SOMESTRING=1'
Sign up to request clarification or add additional context in comments.

1 Comment

Although this is several years old, I still feel the need to point this out since this question shows up on the front page of Google searches: If you care about order of parameters (which I assume you do, because of the doseq=True part), you should be using parse_qsl(), rather than parse_qs() -- the former returns a list of tuples, whereas the latter returns a dict, which is not guaranteed to preserve order when iterated over. Then, adding a param can be done via query_params.append((param_name, param_value)).
9

Use urlsplit() to extract the query string, parse_qsl() to parse it (or parse_qs() if you don't care about argument order), add the new argument, urlencode() to turn it back into a query string, urlunsplit() to fuse it back into a single URL, then redirect the client.

Comments

2

You can use python's url manipulation library furl.

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

1 Comment

It doesn't appear that furl is a built in module, so it would need to be installed first.
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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.