You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
2.0 KiB
Python

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# based on myurlparse.py by alexwlchan
# taken from: https://gist.github.com/alexwlchan/1956efe1acb1f2947cbd575651a3d529
# see also: https://alexwlchan.net/2016/08/dealing-with-query-strings/
try: # Python 3+
from urllib.parse import ( parse_qs, parse_qsl, urlencode, urlparse, urlunparse )
except ImportError: # Python 2
from urllib import urlencode
from urlparse import parse_qs, parse_qsl, urlparse, urlunparse
def get_query_fields( url ):
return dict( parse_qs( urlparse( url ).query ) )
def set_query_fields( url, querydict ):
components = urlparse( url )
old_query = parse_qsl( urlparse( url ).query )
new_query = []
for ( k, vs ) in querydict.items():
for v in vs:
new_query.append( ( k, v ) )
for ( k, v ) in old_query:
if k not in querydict:
new_query.append( ( k, v ) )
components = ( components.scheme,
components.netloc,
components.path,
components.params,
urlencode( new_query ),
components.fragment
)
return urlunparse( components )
def set_url_components( url, scheme = None, netloc = None, path = None, params = None, query = None, fragment = None ):
components = urlparse( url )
components = ( callable( scheme ) and scheme( components.scheme ) or scheme or components.scheme,
callable( netloc ) and netloc( components.netloc ) or netloc or components.netloc,
callable( path ) and path( components.path ) or path or components.path,
callable( params ) and params( components.params ) or params or components.params,
callable( query ) and query( components.query ) or query or components.query,
callable( fragment ) and fragment( components.fragment ) or fragment or components.fragment,
)
return urlunparse( components )