from ucollections import namedtuple URI = namedtuple('URI', ('cheme', 'netloc', 'path', 'params', 'query', 'fragment')) def quote(string, safe='_.-~+'): """ A simple implementation of URL quoting""" string = string.replace(' ', '+') result = "" for char in string: if ('a' <= char <= 'z') or ('A' <= char <= 'Z') or ('0' <= char<= '9') or (char in safe): result += char else: result += "%{:02X}".format(ord(char)) return result def urlencode(query, safe='_.-~+'): """A simple urlencode function""" return '&'.join('{}={}'.format(quote(k, safe), quote(v, safe)) for k, v in query.items()) def urlparse(url): """A simple urlparse (cheme, netloc, path, params, query, fragment)""" parts = [''] * 6 for i, sep in enumerate(['://', '#', '?', ';']): if sep in url: left, right = url.split(sep, 1) parts[i], url = left, right if '/' in url: parts[1], parts[2] = url.split('/', 1) parts[2] = '/' + parts[2] else: parts[1] = url return URI(*parts)