urllib.parse divide URLs, interpreta query strings e aplica percent-encoding. urlsplit mantém esquema, autoridade, caminho, consulta e fragmento separados; urlencode produz parâmetros com escape correto.

from urllib.parse import parse_qs, urlencode, urlsplit, urlunsplit

parts = urlsplit("https://example.com/search?q=python&page=2")
query = parse_qs(parts.query)
query["page"] = ["3"]

new_url = urlunsplit(parts._replace(query=urlencode(query, doseq=True)))
print(new_url)

Como usar com segurança

O parser não afirma que uma URL é segura. Para redirecionamentos ou requisições, aceite apenas esquemas esperados, valide o hostname e considere resolução DNS e endereços internos. Ao combinar uma base com entrada externa, lembre que urljoin aceita URLs absolutas.

Para aprofundar a base, consulte guia de collections em Python e guia de type hints.

A documentação oficial do Python, consultada em 22 de julho de 2026, descreve a API, os casos-limite e a compatibilidade entre versões.