def urlsplit(url, scheme='', allow_fragments=True):
    """Parse a URL into 5 components:
    <scheme>://<netloc>/<path>?<query>#<fragment>
    Return a 5-tuple: (scheme, netloc, path, query, fragment).
    Note that we don't break the components up in smaller bits
    (e.g. netloc is a single string) and we don't expand % escapes."""
    allow_fragments = bool(allow_fragments)
    key = url, scheme, allow_fragments, type(url), type(scheme)
    cached = _parse_cache.get(key, None)
    if cached:
        return cached
    if len(_parse_cache) >= MAX_CACHE_SIZE: # avoid runaway growth
        clear_cache()
    netloc = query = fragment = ''
    i = url.find(':')
    if i > 0:
        if url[:i] == 'http': # optimize the common case
            scheme = url[:i].lower()
            url = url[i+1:]
            if url[:2] == '//':
                netloc, url = _splitnetloc(url, 2)
                if (('[' in netloc and ']' not in netloc) or
                        (']' in netloc and '[' not in netloc)):
                    raise ValueError("Invalid IPv6 URL")
            if allow_fragments and '#' in url:
                url, fragment = url.split('#', 1)
            if '?' in url:
                url, query = url.split('?', 1)
            v = SplitResult(scheme, netloc, url, query, fragment)
            _parse_cache[key] = v
            return v
        for c in url[:i]:
            if c not in scheme_chars:
                break
        else:
            # make sure "url" is not actually a port number (in which case
            # "scheme" is really part of the path)
            rest = url[i+1:]
            if not rest or any(c not in '0123456789' for c in rest):
                # not a port number
                scheme, url = url[:i].lower(), rest

    if url[:2] == '//':
        netloc, url = _splitnetloc(url, 2)
        if (('[' in netloc and ']' not in netloc) or
                (']' in netloc and '[' not in netloc)):
            raise ValueError("Invalid IPv6 URL")
    if allow_fragments and '#' in url:
        url, fragment = url.split('#', 1)
    if '?' in url:
        url, query = url.split('?', 1)
    v = SplitResult(scheme, netloc, url, query, fragment)
    _parse_cache[key] = v
    return v
def urlsplit(url, scheme='', allow_fragments=True):
    """Parse a URL into 5 components:
    <scheme>://<netloc>/<path>?<query>#<fragment>
    Return a 5-tuple: (scheme, netloc, path, query, fragment).
    Note that we don't break the components up in smaller bits
    (e.g. netloc is a single string) and we don't expand % escapes."""
    allow_fragments = bool(allow_fragments)
    key = url, scheme, allow_fragments, type(url), type(scheme)
    cached = _parse_cache.get(key, None)
    if cached:
        return cached
    if len(_parse_cache) >= MAX_CACHE_SIZE: # avoid runaway growth
        clear_cache()
    netloc = query = fragment = ''
    i = url.find(':')
    if i > 0:
        if url[:i] == 'http': # optimize the common case
            scheme = url[:i].lower()
            url = url[i+1:]
            if url[:2] == '//':
                netloc, url = _splitnetloc(url, 2)
                if (('[' in netloc and ']' not in netloc) or
                        (']' in netloc and '[' not in netloc)):
                    raise ValueError("Invalid IPv6 URL")
            if allow_fragments and '#' in url:
                url, fragment = url.split('#', 1)
            if '?' in url:
                url, query = url.split('?', 1)
            v = SplitResult(scheme, netloc, url, query, fragment)
            _parse_cache[key] = v
            return v
        for c in url[:i]:
            if c not in scheme_chars:
                break
        else:
            # make sure "url" is not actually a port number (in which case
            # "scheme" is really part of the path)
            rest = url[i+1:]
            if not rest or any(c not in '0123456789' for c in rest):
                # not a port number
                scheme, url = url[:i].lower(), rest

    if url[:2] == '//':
        netloc, url = _splitnetloc(url, 2)
        if (('[' in netloc and ']' not in netloc) or
                (']' in netloc and '[' not in netloc)):
            raise ValueError("Invalid IPv6 URL")
    if allow_fragments and '#' in url:
        url, fragment = url.split('#', 1)
    if '?' in url:
        url, query = url.split('?', 1)
    v = SplitResult(scheme, netloc, url, query, fragment)
    _parse_cache[key] = v
    return v
def urlsplit ( url , scheme = '' , allow_fragments = True ) : allow_fragments = bool ( allow_fragments ) key = url , scheme , allow_fragments , type ( url ) , type ( scheme ) cached = _parse_cache . get ( key , None ) if cached : return cached if len ( _parse_cache ) >= MAX_CACHE_SIZE : # avoid runaway growth clear_cache ( ) netloc = query = fragment = '' i = url . find ( ':' ) if i > 0 : if url [ : i ] == 'http' : # optimize the common case scheme = url [ : i ] . lower ( ) url = url [ i + 1 : ] if url [ : 2 ] == '//' : netloc , url = _splitnetloc ( url , 2 ) if ( ( '[' in netloc and ']' not in netloc ) or ( ']' in netloc and '[' not in netloc ) ) : raise ValueError ( "Invalid IPv6 URL" ) if allow_fragments and '#' in url : url , fragment = url . split ( '#' , 1 ) if '?' in url : url , query = url . split ( '?' , 1 ) v = SplitResult ( scheme , netloc , url , query , fragment ) _parse_cache [ key ] = v return v for c in url [ : i ] : if c not in scheme_chars : break else : # make sure "url" is not actually a port number (in which case # "scheme" is really part of the path) rest = url [ i + 1 : ] if not rest or any ( c not in '0123456789' for c in rest ) : # not a port number scheme , url = url [ : i ] . lower ( ) , rest if url [ : 2 ] == '//' : netloc , url = _splitnetloc ( url , 2 ) if ( ( '[' in netloc and ']' not in netloc ) or ( ']' in netloc and '[' not in netloc ) ) : raise ValueError ( "Invalid IPv6 URL" ) if allow_fragments and '#' in url : url , fragment = url . split ( '#' , 1 ) if '?' in url : url , query = url . split ( '?' , 1 ) v = SplitResult ( scheme , netloc , url , query , fragment ) _parse_cache [ key ] = v return v
Parse a URL into 5 components:
    <scheme>://<netloc>/<path>?<query>#<fragment>
    Return a 5-tuple: (scheme, netloc, path, query, fragment).
    Note that we don't break the components up in smaller bits
    (e.g. netloc is a single string) and we don't expand % escapes.
Parse a URL into 5 components : <scheme > : // <netloc > / <path > ?<query > #<fragment > Return a 5 - tuple : ( scheme netloc path query fragment ) . Note that we don t break the components up in smaller bits ( e . g . netloc is a single string ) and we don t expand % escapes .