Changelog
### 4.9.3
```
==================
Bugs fixed
----------
* ``lxml.objectify`` accepted non-decimal numbers like ``²²²`` as integers.
* A memory leak in ``lxml.html.clean`` was resolved by switching to Cython 0.29.34+.
* GH348: URL checking in the HTML cleaner was improved.
Patch by Tim McCormack.
* GH371, GH373: Some regex strings were changed to raw strings to fix Python warnings.
Patches by Jakub Wilk and Anthony Sottile.
Other changes
-------------
* Wheels include zlib 1.2.13, libxml2 2.10.3 and libxslt 1.1.38
(zlib 1.2.12, libxml2 2.10.3 and libxslt 1.1.37 on Windows).
* Built with Cython 0.29.36 to adapt to changes in Python 3.12.
```
### 4.9.2
```
==================
Bugs fixed
----------
* CVE-2022-2309: A Bug in libxml2 2.9.1[0-4] could let namespace declarations
from a failed parser run leak into later parser runs. This bug was worked around
in lxml and resolved in libxml2 2.10.0.
https://gitlab.gnome.org/GNOME/libxml2/-/issues/378
Other changes
-------------
* LP1981760: ``Element.attrib`` now registers as ``collections.abc.MutableMapping``.
* lxml now has a static build setup for macOS on ARM64 machines (not used for building wheels).
Patch by Quentin Leffray.
```
### 4.9.1
```
==================
Bugs fixed
----------
* A crash was resolved when using ``iterwalk()`` (or ``canonicalize()``)
after parsing certain incorrect input. Note that ``iterwalk()`` can crash
on *valid* input parsed with the same parser *after* failing to parse the
incorrect input.
```
### 4.9.0
```
==================
Bugs fixed
----------
* GH341: The mixin inheritance order in ``lxml.html`` was corrected.
Patch by xmo-odoo.
Other changes
-------------
* Built with Cython 0.29.30 to adapt to changes in Python 3.11 and 3.12.
* Wheels include zlib 1.2.12, libxml2 2.9.14 and libxslt 1.1.35
(libxml2 2.9.12+ and libxslt 1.1.34 on Windows).
* GH343: Windows-AArch64 build support in Visual Studio.
Patch by Steve Dower.
```
### 4.8.0
```
==================
Features added
--------------
* GH337: Path-like objects are now supported throughout the API instead of just strings.
Patch by Henning Janssen.
* The ``ElementMaker`` now supports ``QName`` values as tags, which always override
the default namespace of the factory.
Bugs fixed
----------
* GH338: In lxml.objectify, the XSI float annotation "nan" and "inf" were spelled in
lower case, whereas XML Schema datatypes define them as "NaN" and "INF" respectively.
Patch by Tobias Deiminger.
Other changes
-------------
* Built with Cython 0.29.28.
```
### 4.7.1
```
==================
Features added
--------------
* Chunked Unicode string parsing via ``parser.feed()`` now encodes the input data
to the native UTF-8 encoding directly, instead of going through ``Py_UNICODE`` /
``wchar_t`` encoding first, which previously required duplicate recoding in most cases.
Bugs fixed
----------
* The standard namespace prefixes were mishandled during "C14N2" serialisation on Python 3.
See https://mail.python.org/archives/list/lxmlpython.org/thread/6ZFBHFOVHOS5GFDOAMPCT6HM5HZPWQ4Q/
* ``lxml.objectify`` previously accepted non-XML numbers with underscores (like "1_000")
as integers or float values in Python 3.6 and later. It now adheres to the number
format of the XML spec again.
* LP1939031: Static wheels of lxml now contain the header files of zlib and libiconv
(in addition to the already provided headers of libxml2/libxslt/libexslt).
Other changes
-------------
* Wheels include libxml2 2.9.12+ and libxslt 1.1.34 (also on Windows).
```
### 4.7.0
```
==================
* Release retracted due to missing files in lxml/includes/.
```
### 4.6.5
```
==================
Bugs fixed
----------
* A vulnerability (GHSL-2021-1038) in the HTML cleaner allowed sneaking script
content through SVG images (CVE-2021-43818).
* A vulnerability (GHSL-2021-1037) in the HTML cleaner allowed sneaking script
content through CSS imports and other crafted constructs (CVE-2021-43818).
```
### 4.6.4
```
==================
Features added
--------------
* GH317: A new property ``system_url`` was added to DTD entities.
Patch by Thirdegree.
* GH314: The ``STATIC_*`` variables in ``setup.py`` can now be passed via env vars.
Patch by Isaac Jurado.
```
### 4.6.3
```
==================
Bugs fixed
----------
* A vulnerability (CVE-2021-28957) was discovered in the HTML Cleaner by Kevin Chung,
which allowed JavaScript to pass through. The cleaner now removes the HTML5
``formaction`` attribute.
```
### 4.6.2
```
==================
Bugs fixed
----------
* A vulnerability (CVE-2020-27783) was discovered in the HTML Cleaner by Yaniv Nizry,
which allowed JavaScript to pass through. The cleaner now removes more sneaky
"style" content.
```
### 4.6.1
```
==================
Bugs fixed
----------
* A vulnerability was discovered in the HTML Cleaner by Yaniv Nizry, which allowed
JavaScript to pass through. The cleaner now removes more sneaky "style" content.
```
### 4.6.0
```
==================
Features added
--------------
* GH310: ``lxml.html.InputGetter`` supports ``__len__()`` to count the number of input fields.
Patch by Aidan Woolley.
* ``lxml.html.InputGetter`` has a new ``.items()`` method to ease processing all input fields.
* ``lxml.html.InputGetter.keys()`` now returns the field names in document order.
* GH-309: The API documentation is now generated using ``sphinx-apidoc``.
Patch by Chris Mayo.
Bugs fixed
----------
* LP1869455: C14N 2.0 serialisation failed for unprefixed attributes
when a default namespace was defined.
* ``TreeBuilder.close()`` raised ``AssertionError`` in some error cases where it
should have raised ``XMLSyntaxError``. It now raises a combined exception to
keep up backwards compatibility, while switching to ``XMLSyntaxError`` as an
interface.
```
### 4.5.2
```
==================
Bugs fixed
----------
* ``Cleaner()`` now validates that only known configuration options can be set.
* LP1882606: ``Cleaner.clean_html()`` discarded comments and PIs regardless of the
corresponding configuration option, if ``remove_unknown_tags`` was set.
* LP1880251: Instead of globally overwriting the document loader in libxml2, lxml now
sets it per parser run, which improves the interoperability with other users of libxml2
such as libxmlsec.
* LP1881960: Fix build in CPython 3.10 by using Cython 0.29.21.
* The setup options "--with-xml2-config" and "--with-xslt-config" were accidentally renamed
to "--xml2-config" and "--xslt-config" in 4.5.1 and are now available again.
```
### 4.5.1
```
==================
Bugs fixed
----------
* LP1570388: Fix failures when serialising documents larger than 2GB in some cases.
* LP1865141, GH298: ``QName`` values were not accepted by the ``el.iter()`` method.
Patch by xmo-odoo.
* LP1863413, GH297: The build failed to detect libraries on Linux that are only
configured via pkg-config.
Patch by Hugh McMaster.
```
### 4.5.0
```
==================
Features added
--------------
* A new function ``indent()`` was added to insert tail whitespace for pretty-printing
an XML tree.
Bugs fixed
----------
* LP1857794: Tail text of nodes that get removed from a document using item
deletion disappeared silently instead of sticking with the node that was removed.
Other changes
-------------
* MacOS builds are 64-bit-only by default.
Set CFLAGS and LDFLAGS explicitly to override it.
* Linux/MacOS Binary wheels now use libxml2 2.9.10 and libxslt 1.1.34.
* LP1840234: The package version number is now available as ``lxml.__version__``.
```
### 4.4.3
```
==================
Bugs fixed
----------
* LP1844674: ``itertext()`` was missing tail text of comments and PIs since 4.4.0.
```
### 4.4.2
```
==================
Bugs fixed
----------
* LP1835708: ``ElementInclude`` incorrectly rejected repeated non-recursive
includes as recursive.
Patch by Rainer Hausdorf.
```
### 4.4.1
```
==================
Bugs fixed
----------
* LP1838252: The order of an OrderedDict was lost in 4.4.0 when passing it as
attrib mapping during element creation.
* LP1838521: The package metadata now lists the supported Python versions.
```
### 4.4.0
```
==================
Features added
--------------
* ``Element.clear()`` accepts a new keyword argument ``keep_tail=True`` to clear
everything but the tail text. This is helpful in some document-style use cases
and for clearing the current element in ``iterparse()`` and pull parsing.
* When creating attributes or namespaces from a dict in Python 3.6+, lxml now
preserves the original insertion order of that dict, instead of always sorting
the items by name. A similar change was made for ElementTree in CPython 3.8.
See https://bugs.python.org/issue34160
* Integer elements in ``lxml.objectify`` implement the ``__index__()`` special method.
* GH269: Read-only elements in XSLT were missing the ``nsmap`` property.
Original patch by Jan Pazdziora.
* ElementInclude can now restrict the maximum inclusion depth via a ``max_depth``
argument to prevent content explosion. It is limited to 6 by default.
* The ``target`` object of the XMLParser can have ``start_ns()`` and ``end_ns()``
callback methods to listen to namespace declarations.
* The ``TreeBuilder`` has new arguments ``comment_factory`` and ``pi_factory`` to
pass factories for creating comments and processing instructions, as well as
flag arguments ``insert_comments`` and ``insert_pis`` to discard them from the
tree when set to false.
* A `C14N 2.0 <https://www.w3.org/TR/xml-c14n2/>`_ implementation was added as
``etree.canonicalize()``, a corresponding ``C14NWriterTarget`` class, and
a ``c14n2`` serialisation method.
Bugs fixed
----------
* When writing to file paths that contain the URL escape character '%', the file
path could wrongly be mangled by URL unescaping and thus write to a different
file or directory. Code that writes to file paths that are provided by untrusted
sources, but that must work with previous versions of lxml, should best either
reject paths that contain '%' characters, or otherwise make sure that the path
does not contain maliciously injected '%XX' URL hex escapes for paths like '../'.
* Assigning to Element child slices with negative step could insert the slice at
the wrong position, starting too far on the left.
* Assigning to Element child slices with overly large step size could take very
long, regardless of the length of the actual slice.
* Assigning to Element child slices of the wrong size could sometimes fail to
raise a ValueError (like a list assignment would) and instead assign outside
of the original slice bounds or leave parts of it unreplaced.
* The ``comment`` and ``pi`` events in ``iterwalk()`` were never triggered, and
instead, comments and processing instructions in the tree were reported as
``start`` elements. Also, when walking an ElementTree (as opposed to its root
element), comments and PIs outside of the root element are now reported.
* LP1827833: The RelaxNG compact syntax support was broken with recent versions
of ``rnc2rng``.
* LP1758553: The HTML elements ``source`` and ``track`` were added to the list
of empty tags in ``lxml.html.defs``.
* Registering a prefix other than "xml" for the XML namespace is now rejected.
* Failing to write XSLT output to a file could raise a misleading exception.
It now raises ``IOError``.
Other changes
-------------
* Support for Python 3.4 was removed.
* When using ``Element.find*()`` with prefix-namespace mappings, the empty string
is now accepted to define a default namespace, in addition to the previously
supported ``None`` prefix. Empty strings are more convenient since they keep
all prefix keys in a namespace dict strings, which simplifies sorting etc.
* The ``ElementTree.write_c14n()`` method has been deprecated in favour of the
long preferred ``ElementTree.write(f, method="c14n")``. It will be removed
in a future release.
```
### 4.3.5
```
==================
* Rebuilt with Cython 0.29.13 to support Python 3.8.
```
### 4.3.4
```
==================
* Rebuilt with Cython 0.29.10 to support Python 3.8.
```
Links
- PyPI: https://pypi.org/project/lxml
- Changelog: https://pyup.io/changelogs/lxml/
- Homepage: https://lxml.de/
This PR updates lxml from 4.3.3 to 4.9.3.
Changelog
### 4.9.3 ``` ================== Bugs fixed ---------- * ``lxml.objectify`` accepted non-decimal numbers like ``²²²`` as integers. * A memory leak in ``lxml.html.clean`` was resolved by switching to Cython 0.29.34+. * GH348: URL checking in the HTML cleaner was improved. Patch by Tim McCormack. * GH371, GH373: Some regex strings were changed to raw strings to fix Python warnings. Patches by Jakub Wilk and Anthony Sottile. Other changes ------------- * Wheels include zlib 1.2.13, libxml2 2.10.3 and libxslt 1.1.38 (zlib 1.2.12, libxml2 2.10.3 and libxslt 1.1.37 on Windows). * Built with Cython 0.29.36 to adapt to changes in Python 3.12. ``` ### 4.9.2 ``` ================== Bugs fixed ---------- * CVE-2022-2309: A Bug in libxml2 2.9.1[0-4] could let namespace declarations from a failed parser run leak into later parser runs. This bug was worked around in lxml and resolved in libxml2 2.10.0. https://gitlab.gnome.org/GNOME/libxml2/-/issues/378 Other changes ------------- * LP1981760: ``Element.attrib`` now registers as ``collections.abc.MutableMapping``. * lxml now has a static build setup for macOS on ARM64 machines (not used for building wheels). Patch by Quentin Leffray. ``` ### 4.9.1 ``` ================== Bugs fixed ---------- * A crash was resolved when using ``iterwalk()`` (or ``canonicalize()``) after parsing certain incorrect input. Note that ``iterwalk()`` can crash on *valid* input parsed with the same parser *after* failing to parse the incorrect input. ``` ### 4.9.0 ``` ================== Bugs fixed ---------- * GH341: The mixin inheritance order in ``lxml.html`` was corrected. Patch by xmo-odoo. Other changes ------------- * Built with Cython 0.29.30 to adapt to changes in Python 3.11 and 3.12. * Wheels include zlib 1.2.12, libxml2 2.9.14 and libxslt 1.1.35 (libxml2 2.9.12+ and libxslt 1.1.34 on Windows). * GH343: Windows-AArch64 build support in Visual Studio. Patch by Steve Dower. ``` ### 4.8.0 ``` ================== Features added -------------- * GH337: Path-like objects are now supported throughout the API instead of just strings. Patch by Henning Janssen. * The ``ElementMaker`` now supports ``QName`` values as tags, which always override the default namespace of the factory. Bugs fixed ---------- * GH338: In lxml.objectify, the XSI float annotation "nan" and "inf" were spelled in lower case, whereas XML Schema datatypes define them as "NaN" and "INF" respectively. Patch by Tobias Deiminger. Other changes ------------- * Built with Cython 0.29.28. ``` ### 4.7.1 ``` ================== Features added -------------- * Chunked Unicode string parsing via ``parser.feed()`` now encodes the input data to the native UTF-8 encoding directly, instead of going through ``Py_UNICODE`` / ``wchar_t`` encoding first, which previously required duplicate recoding in most cases. Bugs fixed ---------- * The standard namespace prefixes were mishandled during "C14N2" serialisation on Python 3. See https://mail.python.org/archives/list/lxmlpython.org/thread/6ZFBHFOVHOS5GFDOAMPCT6HM5HZPWQ4Q/ * ``lxml.objectify`` previously accepted non-XML numbers with underscores (like "1_000") as integers or float values in Python 3.6 and later. It now adheres to the number format of the XML spec again. * LP1939031: Static wheels of lxml now contain the header files of zlib and libiconv (in addition to the already provided headers of libxml2/libxslt/libexslt). Other changes ------------- * Wheels include libxml2 2.9.12+ and libxslt 1.1.34 (also on Windows). ``` ### 4.7.0 ``` ================== * Release retracted due to missing files in lxml/includes/. ``` ### 4.6.5 ``` ================== Bugs fixed ---------- * A vulnerability (GHSL-2021-1038) in the HTML cleaner allowed sneaking script content through SVG images (CVE-2021-43818). * A vulnerability (GHSL-2021-1037) in the HTML cleaner allowed sneaking script content through CSS imports and other crafted constructs (CVE-2021-43818). ``` ### 4.6.4 ``` ================== Features added -------------- * GH317: A new property ``system_url`` was added to DTD entities. Patch by Thirdegree. * GH314: The ``STATIC_*`` variables in ``setup.py`` can now be passed via env vars. Patch by Isaac Jurado. ``` ### 4.6.3 ``` ================== Bugs fixed ---------- * A vulnerability (CVE-2021-28957) was discovered in the HTML Cleaner by Kevin Chung, which allowed JavaScript to pass through. The cleaner now removes the HTML5 ``formaction`` attribute. ``` ### 4.6.2 ``` ================== Bugs fixed ---------- * A vulnerability (CVE-2020-27783) was discovered in the HTML Cleaner by Yaniv Nizry, which allowed JavaScript to pass through. The cleaner now removes more sneaky "style" content. ``` ### 4.6.1 ``` ================== Bugs fixed ---------- * A vulnerability was discovered in the HTML Cleaner by Yaniv Nizry, which allowed JavaScript to pass through. The cleaner now removes more sneaky "style" content. ``` ### 4.6.0 ``` ================== Features added -------------- * GH310: ``lxml.html.InputGetter`` supports ``__len__()`` to count the number of input fields. Patch by Aidan Woolley. * ``lxml.html.InputGetter`` has a new ``.items()`` method to ease processing all input fields. * ``lxml.html.InputGetter.keys()`` now returns the field names in document order. * GH-309: The API documentation is now generated using ``sphinx-apidoc``. Patch by Chris Mayo. Bugs fixed ---------- * LP1869455: C14N 2.0 serialisation failed for unprefixed attributes when a default namespace was defined. * ``TreeBuilder.close()`` raised ``AssertionError`` in some error cases where it should have raised ``XMLSyntaxError``. It now raises a combined exception to keep up backwards compatibility, while switching to ``XMLSyntaxError`` as an interface. ``` ### 4.5.2 ``` ================== Bugs fixed ---------- * ``Cleaner()`` now validates that only known configuration options can be set. * LP1882606: ``Cleaner.clean_html()`` discarded comments and PIs regardless of the corresponding configuration option, if ``remove_unknown_tags`` was set. * LP1880251: Instead of globally overwriting the document loader in libxml2, lxml now sets it per parser run, which improves the interoperability with other users of libxml2 such as libxmlsec. * LP1881960: Fix build in CPython 3.10 by using Cython 0.29.21. * The setup options "--with-xml2-config" and "--with-xslt-config" were accidentally renamed to "--xml2-config" and "--xslt-config" in 4.5.1 and are now available again. ``` ### 4.5.1 ``` ================== Bugs fixed ---------- * LP1570388: Fix failures when serialising documents larger than 2GB in some cases. * LP1865141, GH298: ``QName`` values were not accepted by the ``el.iter()`` method. Patch by xmo-odoo. * LP1863413, GH297: The build failed to detect libraries on Linux that are only configured via pkg-config. Patch by Hugh McMaster. ``` ### 4.5.0 ``` ================== Features added -------------- * A new function ``indent()`` was added to insert tail whitespace for pretty-printing an XML tree. Bugs fixed ---------- * LP1857794: Tail text of nodes that get removed from a document using item deletion disappeared silently instead of sticking with the node that was removed. Other changes ------------- * MacOS builds are 64-bit-only by default. Set CFLAGS and LDFLAGS explicitly to override it. * Linux/MacOS Binary wheels now use libxml2 2.9.10 and libxslt 1.1.34. * LP1840234: The package version number is now available as ``lxml.__version__``. ``` ### 4.4.3 ``` ================== Bugs fixed ---------- * LP1844674: ``itertext()`` was missing tail text of comments and PIs since 4.4.0. ``` ### 4.4.2 ``` ================== Bugs fixed ---------- * LP1835708: ``ElementInclude`` incorrectly rejected repeated non-recursive includes as recursive. Patch by Rainer Hausdorf. ``` ### 4.4.1 ``` ================== Bugs fixed ---------- * LP1838252: The order of an OrderedDict was lost in 4.4.0 when passing it as attrib mapping during element creation. * LP1838521: The package metadata now lists the supported Python versions. ``` ### 4.4.0 ``` ================== Features added -------------- * ``Element.clear()`` accepts a new keyword argument ``keep_tail=True`` to clear everything but the tail text. This is helpful in some document-style use cases and for clearing the current element in ``iterparse()`` and pull parsing. * When creating attributes or namespaces from a dict in Python 3.6+, lxml now preserves the original insertion order of that dict, instead of always sorting the items by name. A similar change was made for ElementTree in CPython 3.8. See https://bugs.python.org/issue34160 * Integer elements in ``lxml.objectify`` implement the ``__index__()`` special method. * GH269: Read-only elements in XSLT were missing the ``nsmap`` property. Original patch by Jan Pazdziora. * ElementInclude can now restrict the maximum inclusion depth via a ``max_depth`` argument to prevent content explosion. It is limited to 6 by default. * The ``target`` object of the XMLParser can have ``start_ns()`` and ``end_ns()`` callback methods to listen to namespace declarations. * The ``TreeBuilder`` has new arguments ``comment_factory`` and ``pi_factory`` to pass factories for creating comments and processing instructions, as well as flag arguments ``insert_comments`` and ``insert_pis`` to discard them from the tree when set to false. * A `C14N 2.0 <https://www.w3.org/TR/xml-c14n2/>`_ implementation was added as ``etree.canonicalize()``, a corresponding ``C14NWriterTarget`` class, and a ``c14n2`` serialisation method. Bugs fixed ---------- * When writing to file paths that contain the URL escape character '%', the file path could wrongly be mangled by URL unescaping and thus write to a different file or directory. Code that writes to file paths that are provided by untrusted sources, but that must work with previous versions of lxml, should best either reject paths that contain '%' characters, or otherwise make sure that the path does not contain maliciously injected '%XX' URL hex escapes for paths like '../'. * Assigning to Element child slices with negative step could insert the slice at the wrong position, starting too far on the left. * Assigning to Element child slices with overly large step size could take very long, regardless of the length of the actual slice. * Assigning to Element child slices of the wrong size could sometimes fail to raise a ValueError (like a list assignment would) and instead assign outside of the original slice bounds or leave parts of it unreplaced. * The ``comment`` and ``pi`` events in ``iterwalk()`` were never triggered, and instead, comments and processing instructions in the tree were reported as ``start`` elements. Also, when walking an ElementTree (as opposed to its root element), comments and PIs outside of the root element are now reported. * LP1827833: The RelaxNG compact syntax support was broken with recent versions of ``rnc2rng``. * LP1758553: The HTML elements ``source`` and ``track`` were added to the list of empty tags in ``lxml.html.defs``. * Registering a prefix other than "xml" for the XML namespace is now rejected. * Failing to write XSLT output to a file could raise a misleading exception. It now raises ``IOError``. Other changes ------------- * Support for Python 3.4 was removed. * When using ``Element.find*()`` with prefix-namespace mappings, the empty string is now accepted to define a default namespace, in addition to the previously supported ``None`` prefix. Empty strings are more convenient since they keep all prefix keys in a namespace dict strings, which simplifies sorting etc. * The ``ElementTree.write_c14n()`` method has been deprecated in favour of the long preferred ``ElementTree.write(f, method="c14n")``. It will be removed in a future release. ``` ### 4.3.5 ``` ================== * Rebuilt with Cython 0.29.13 to support Python 3.8. ``` ### 4.3.4 ``` ================== * Rebuilt with Cython 0.29.10 to support Python 3.8. ```Links
- PyPI: https://pypi.org/project/lxml - Changelog: https://pyup.io/changelogs/lxml/ - Homepage: https://lxml.de/