The module provides handy
URL class for URL parsing and
URL is constructed from
>>> from yarl import URL >>> url = URL('https://www.python.org/~guido?arg=1#frag') >>> url URL('https://www.python.org/~guido?arg=1#frag')
All URL parts: scheme, user, password, host, port, path, query and fragment are accessible by properties:
>>> url.scheme 'https' >>> url.host 'www.python.org' >>> url.path '/~guido' >>> url.query_string 'arg=1' >>> url.query <MultiDictProxy('arg': '1')> >>> url.fragment 'frag'
All URL manipulations produces a new URL object:
>>> url.parent / 'downloads/source' URL('https://www.python.org/downloads/source')
Strings passed to constructor and modification methods are automatically encoded giving canonical representation as result:
>>> url = URL('https://www.python.org/путь') >>> url URL('https://www.python.org/%D0%BF%D1%83%D1%82%D1%8C')
Regular properties are percent-decoded, use
raw_ versions for
getting encoded strings:
>>> url.path '/путь' >>> url.raw_path '/%D0%BF%D1%83%D1%82%D1%8C'
Human readable representation of URL is available as
>>> url.human_repr() 'https://www.python.org/путь'
For full documentation please read Public API section.
$ pip install yarl
The library is Python 3 only!
PyPI contains binary wheels for Linux, Windows and MacOS. If you want to install
yarl on another operating system (like Alpine Linux, which is not
manylinux-compliant because of the missing glibc and therefore, cannot be
used with our wheels) the the tarball will be used to compile the library from
the source code. It requires a C compiler and and Python headers installed.
To skip the compilation you must explicitly opt-in by setting the YARL_NO_EXTENSIONS environment variable to a non-empty value, e.g.:
$ YARL_NO_EXTENSIONS=1 pip install yarl
Please note that the pure-Python (uncompiled) version is much slower. However, PyPy always uses a pure-Python implementation, and, as such, it is unaffected by this variable.
It installs it automatically.
Comparison with other URL libraries¶
The library has a rich functionality but
furlobject is mutable.
I afraid to pass this object into foreign code: who knows if the code will modify my URL in a terrible way while I just want to send URL with handy helpers for accessing URL properties.
furlhas other non obvious tricky things but the main objection is mutability.
URLObject is immutable, that’s pretty good.
Every URL change generates a new URL object.
But the library doesn’t any decode/encode transformations leaving end user to cope with these gory details.
Why isn’t boolean supported by the URL query API?¶
There is no standard for boolean representation of boolean values.
Some systems prefer
false, others like
yarl cannot make an unambiguous decision on how to serialize
because it is specific to how the end-user’s application is built and would be different
for different apps. The library doesn’t accept booleans in the API; a user should
convert bools into strings using own preferred translation protocol.
The project is hosted on GitHub
Please file an issue on the bug tracker if you have found a bug or have some suggestion in order to improve the library.
The library uses Azure Pipelines for Continuous Integration.