url-normalize
URI Normalization function:
- Take care of IDN domains.
- Always provide the URI scheme in lowercase characters.
- Always provide the host, if any, in lowercase characters.
- Only perform percent-encoding where it is essential.
- Always use uppercase A-through-F characters when percent-encoding.
- Prevent dot-segments appearing in non-relative URI paths.
- For schemes that define a default authority, use an empty authority if the default is desired.
- For schemes that define an empty path to be equivalent to a path of "/", use "/".
- For schemes that define a port, use an empty port if the default is desired
- All portions of the URI must be utf-8 encoded NFC from Unicode strings
Inspired by Sam Ruby's urlnorm.py
Features
- IDN (Internationalized Domain Name) support
- Configurable default scheme (https by default)
- Query parameter filtering with allowlists
- Support for various URL formats including:
- Empty string URLs
- Double slash URLs (//domain.tld)
- Shebang (#!) URLs
- Cross-version Python compatibility (3.8+)
- 100% test coverage
- Modern type hints and string handling
Installation
pip install url-normalize
Usage
Basic usage:
from url_normalize import url_normalize
# Basic normalization (uses https by default)
print(url_normalize("www.foo.com:80/foo"))
# Output: https://www.foo.com/foo
# With custom default scheme
print(url_normalize("www.foo.com/foo", default_scheme="http"))
# Output: http://www.foo.com/foo
# With query parameter filtering enabled
print(url_normalize("www.google.com/search?q=test&utm_source=test", filter_params=True))
# Output: https://www.google.com/search?q=test
# With custom parameter allowlist
print(url_normalize(
"example.com?page=1&id=123&ref=test",
filter_params=True,
param_allowlist={"example.com": ["page", "id"]}
))
# Output: https://example.com?page=1&id=123
print(url_normalize(
"example.com?page=1&id=123&ref=test",
filter_params=True,
param_allowlist=["page", "id"]
))
# Output: https://example.com?page=1&id=123
Documentation
For a complete history of changes, see CHANGELOG.md.
License
MIT License
Metadata
Release files for url-normalize 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| url_normalize-2.0.0.tar.gz | 13.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| url_normalize-2.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 25.3 kB
Release files / url_normalize-2.0.0.tar.gz
| Download URL | url_normalize-2.0.0.tar.gz |
|---|---|
| Size | 13.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d987ae0bc134cd2ffcdfd0c6528954dfa7a4065b188499f370b0d39308889443
|
|
BLAKE2b-256 checksum How to use checksums |
a38da51e133efac6d04701832d1f12cdb83c4d9536002e96b3a00e941a8fac01
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.6.10
|
Release files / url_normalize-2.0.0-py3-none-any.whl
| Download URL | url_normalize-2.0.0-py3-none-any.whl |
|---|---|
| Size | 11.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b563eadd6dc364e47930390f5c2e273df78bc4dbb5f8b0a97962fb2a1fa238dd
|
|
BLAKE2b-256 checksum How to use checksums |
a411c8519d4a78e9349aa8a5d55cd57dab84c5047329c1faaadc176032f4fa03
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.6.10
|