From: JinWang An Date: Wed, 30 Dec 2020 01:15:33 +0000 (+0900) Subject: Imported Upstream version 4.3.3 X-Git-Tag: upstream/4.3.3^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2a74432986b7adad7a9c9e7beb8109a4af11f524;p=platform%2Fupstream%2Fpython-lxml.git Imported Upstream version 4.3.3 --- diff --git a/CHANGES.txt b/CHANGES.txt index 0b1aa718..a3fe72c2 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -2,6 +2,15 @@ lxml changelog ============== +4.3.3 (2019-03-26) +================== + +Bugs fixed +---------- + +* Fix leak of output buffer and unclosed files in ``_XSLTResultTree.write_output()``. + + 4.3.2 (2019-02-29) ================== diff --git a/PKG-INFO b/PKG-INFO index 0b90e606..e2d2efba 100644 --- a/PKG-INFO +++ b/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: lxml -Version: 4.3.2 +Version: 4.3.3 Summary: Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. Home-page: http://lxml.de/ Author: lxml dev team @@ -38,18 +38,13 @@ Description: lxml is a Pythonic, mature binding for the libxml2 and libxslt libr as soon as a maintenance branch has been established. Note that this requires Cython to be installed at an appropriate version for the build. - 4.3.2 (2019-02-29) + 4.3.3 (2019-03-26) ================== Bugs fixed ---------- - * Crash in 4.3.1 when appending a child subtree with certain text nodes. - - Other changes - ------------- - - * Built with Cython 0.29.6. + * Fix leak of output buffer and unclosed files in ``_XSLTResultTree.write_output()``. diff --git a/doc/html/FAQ.html b/doc/html/FAQ.html index 4baab776..fe891c58 100644 --- a/doc/html/FAQ.html +++ b/doc/html/FAQ.html @@ -26,7 +26,7 @@ function hide_menu() {
-

lxml FAQ - Frequently Asked Questions

+

lxml FAQ - Frequently Asked Questions

Frequently asked questions on lxml. See also the notes on compatibility to ElementTree.

@@ -993,7 +993,7 @@ map it to your namespace. See also the question above.

diff --git a/doc/html/api.html b/doc/html/api.html index 1022f048..393d5de9 100644 --- a/doc/html/api.html +++ b/doc/html/api.html @@ -24,7 +24,7 @@ function hide_menu() {
-

APIs specific to lxml.etree

+

APIs specific to lxml.etree

lxml.etree tries to follow established APIs wherever possible. Sometimes, however, the need to expose a feature in an easy way led to the invention of a @@ -530,7 +530,7 @@ example:

diff --git a/doc/html/api/abc.ABCMeta-class.html b/doc/html/api/abc.ABCMeta-class.html index e15e3d6f..e2b3b33b 100644 --- a/doc/html/api/abc.ABCMeta-class.html +++ b/doc/html/api/abc.ABCMeta-class.html @@ -427,7 +427,7 @@ even via super()).

Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 E Element factory for generating XML d   - __pyx_capi__ = {'ET': <capsule object "PyObject *" at 0x7f6cce... + __pyx_capi__ = {'ET': <capsule object "PyObject *" at 0x7fa92b... @@ -249,8 +249,8 @@ The E Element factory for generating XML d
Value:
-{'ET': <capsule object "PyObject *" at 0x7f6cce0ac270>,
- 'partial': <capsule object "PyObject *" at 0x7f6cce0ac2a0>}
+{'ET': <capsule object "PyObject *" at 0x7fa92b459a20>,
+ 'partial': <capsule object "PyObject *" at 0x7fa92b459a50>}
 
@@ -289,7 +289,7 @@ The E Element factory for generating XML d Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 namespace to the Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 CSSSelector Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 namespaces keyword argument:

Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019
Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 want and got. Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 lxml.etree module implements the exten

Version: - 4.3.2 + 4.3.3

@@ -1725,7 +1725,7 @@ standard Python logging package.   - LXML_VERSION = (4, 3, 2, 0) + LXML_VERSION = (4, 3, 3, 0) @@ -1741,13 +1741,13 @@ standard Python logging package.   __pyx_capi__ = {'adoptExternalDocument': <capsule object "stru... @@ -2504,13 +2504,13 @@ function will only set the global error log of the current thread.

Value:
 {'adoptExternalDocument': <capsule object "struct LxmlElementTree *(xm\
-lDoc *, PyObject *, int)" at 0x7f6cd29a50c0>,
+lDoc *, PyObject *, int)" at 0x7fa92f808f00>,
  'appendChild': <capsule object "void (struct LxmlElement *, struct Lx\
-mlElement *)" at 0x7f6cd29a58a0>,
+mlElement *)" at 0x7fa92f819720>,
  'appendChildToElement': <capsule object "int (struct LxmlElement *, s\
-truct LxmlElement *)" at 0x7f6cd29a58d0>,
+truct LxmlElement *)" at 0x7fa92f819750>,
  'attributeValue': <capsule object "PyObject *(xmlNode *, xmlAttr *)" \
-at 0x7f6cd29a5570>,
+at 0x7fa92f8193f0>,
 ...
 
@@ -2576,7 +2576,7 @@ at 0x7f6cd29a5570>, Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 smart_strings=False.

Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019
Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 base_url.

Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019
Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 base_url.

Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019
Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Element.attrib p Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 error_log property Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 <xsl:output> Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 'GET' Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 form.set('novalidate') Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 <option> elemen Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 .value Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 -z0-9%&\?;=~ Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 lxml.etree.

Version: - 4.3.2 + 4.3.3

@@ -1137,7 +1137,7 @@ elements. Pass 'string', for example, to make string values the default.

Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019   - __pyx_capi__ = {'_getNsTag': <capsule object "PyObject *(PyObj... + __pyx_capi__ = {'_getNsTag': <capsule object "PyObject *(PyObj... @@ -282,8 +282,8 @@ them against a SAX ContentHandler.
Value:
-{'_getNsTag': <capsule object "PyObject *(PyObject *)" at 0x7f6ccdd4ff\
-00>}
+{'_getNsTag': <capsule object "PyObject *(PyObject *)" at 0x7fa92abcd6\
+f0>}
 
@@ -322,7 +322,7 @@ them against a SAX ContentHandler. Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 u' Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 handle(self, element, - _fromstring=<cyfunction fromstring at 0x7f6ccf051290>) + _fromstring=<cyfunction fromstring at 0x7fa92f75b290>) source code @@ -213,7 +213,7 @@

handle(self, element, - _fromstring=<cyfunction fromstring at 0x7f6ccf051290>) + _fromstring=<cyfunction fromstring at 0x7fa92f75b290>)

source code  @@ -261,7 +261,7 @@ Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 handle(self, element, - _fromstring=<cyfunction fromstring at 0x7f6ccf051290>) + _fromstring=<cyfunction fromstring at 0x7fa92f75b290>) source code @@ -213,7 +213,7 @@

handle(self, element, - _fromstring=<cyfunction fromstring at 0x7f6ccf051290>) + _fromstring=<cyfunction fromstring at 0x7fa92f75b290>)

source code  @@ -261,7 +261,7 @@ Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 handle(self, xml, - _fromstring=<cyfunction fromstring at 0x7f6ccf051290>) + _fromstring=<cyfunction fromstring at 0x7fa92f75b290>) source code @@ -213,7 +213,7 @@

handle(self, xml, - _fromstring=<cyfunction fromstring at 0x7f6ccf051290>) + _fromstring=<cyfunction fromstring at 0x7fa92f75b290>)

source code  @@ -261,7 +261,7 @@ Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019 Generated by Epydoc 3.0.1 - on Thu Feb 28 20:36:14 2019 + on Tue Mar 26 13:39:43 2019
-

How to build lxml from source

+

How to build lxml from source

To build lxml from source, you need libxml2 and libxslt properly installed, including the header files. These are likely shipped in @@ -317,7 +317,7 @@ installed using dpkg -i

diff --git a/doc/html/capi.html b/doc/html/capi.html index 4349504a..3f665f77 100644 --- a/doc/html/capi.html +++ b/doc/html/capi.html @@ -24,7 +24,7 @@ function hide_menu() {
-

The public C-API of lxml.etree

+

The public C-API of lxml.etree

As of version 1.1, lxml.etree provides a public C-API. This allows external C extensions to efficiently access public functions and classes of lxml, @@ -127,7 +127,7 @@ includes may not be sufficient.

diff --git a/doc/html/changes-4.3.2.html b/doc/html/changes-4.3.2.html deleted file mode 100644 index 6127a82c..00000000 --- a/doc/html/changes-4.3.2.html +++ /dev/null @@ -1,3475 +0,0 @@ - - - - - - -lxml changelog - - - -
-

lxml changelog

- -
-

4.3.2 (2019-02-29)

-
-

Bugs fixed

-
    -
  • Crash in 4.3.1 when appending a child subtree with certain text nodes.
  • -
-
-
-

Other changes

-
    -
  • Built with Cython 0.29.6.
  • -
-
-
-
-

4.3.1 (2019-02-08)

-
-

Bugs fixed

-
    -
  • LP#1814522: Crash when appending a child subtree that contains unsubstituted -entity references.
  • -
-
-
-

Other changes

-
    -
  • Built with Cython 0.29.5.
  • -
-
-
-
-

4.3.0 (2019-01-04)

-
-

Features added

-
    -
  • The module lxml.sax is compiled using Cython in order to speed it up.
  • -
  • GH#267: lxml.sax.ElementTreeProducer now preserves the namespace prefixes. -If two prefixes point to the same URI, the first prefix in alphabetical order -is used. Patch by Lennart Regebro.
  • -
  • Updated ISO-Schematron implementation to 2013 version (now MIT licensed) -and the corresponding schema to the 2016 version (with optional "properties").
  • -
-
-
-

Other changes

-
    -
  • GH#270, GH#271: Support for Python 2.6 and 3.3 was removed. -Patch by hugovk.
  • -
  • The minimum dependency versions were raised to libxml2 2.9.2 and libxslt 1.1.27, -which were released in 2014 and 2012 respectively.
  • -
  • Built with Cython 0.29.2.
  • -
-
-
-
-

4.2.6 (2019-01-02)

-
-

Bugs fixed

-
    -
  • LP#1799755: Fix a DeprecationWarning in Py3.7+.
  • -
  • Import warnings in Python 3.6+ were resolved.
  • -
-
-
-
-

4.2.5 (2018-09-09)

-
-

Bugs fixed

-
    -
  • Javascript URLs that used URL escaping were not removed by the HTML cleaner. -Security problem found by Omar Eissa. (CVE-2018-19787)
  • -
-
-
-
-

4.2.4 (2018-08-03)

-
-

Features added

-
    -
  • GH#259: Allow using pkg-config for build configuration. -Patch by Patrick Griffis.
  • -
-
-
-

Bugs fixed

-
    -
  • LP#1773749, GH#268: Crash when moving an element to another document with -Element.insert(). -Patch by Alexander Weggerle.
  • -
-
-
-
-

4.2.3 (2018-06-27)

-
-

Bugs fixed

-
    -
  • Reverted GH#265: lxml links against zlib as a shared library again.
  • -
-
-
-
-

4.2.2 (2018-06-22)

-
-

Bugs fixed

-
    -
  • GH#266: Fix sporadic crash during GC when parse-time schema validation is used -and the parser participates in a reference cycle. -Original patch by Julien Greard.
  • -
  • GH#265: lxml no longer links against zlib as a shared library, only on static builds. -Patch by Nehal J Wani.
  • -
-
-
-
-

4.2.1 (2018-03-21)

-
-

Bugs fixed

-
    -
  • LP#1755825: iterwalk() failed to return the 'start' event for the initial -element if a tag selector is used.
  • -
  • LP#1756314: Failure to import 4.2.0 into PyPy due to a missing library symbol.
  • -
  • LP#1727864, GH#258: Add "-isysroot" linker option on MacOS as needed by XCode 9.
  • -
-
-
-
-

4.2.0 (2018-03-13)

-
-

Features added

-
    -
  • GH#255: SelectElement.value returns more standard-compliant and -browser-like defaults for non-multi-selects. If no option is selected, the -value of the first option is returned (instead of None). If multiple options -are selected, the value of the last one is returned (instead of that of the -first one). If no options are present (not standard-compliant) -SelectElement.value still returns None.
  • -
  • GH#261: The HTMLParser() now supports the huge_tree option. -Patch by stranac.
  • -
-
-
-

Bugs fixed

-
    -
  • LP#1551797: Some XSLT messages were not captured by the transform error log.
  • -
  • LP#1737825: Crash at shutdown after an interrupted iterparse run with XMLSchema -validation.
  • -
-
-
-

Other changes

-
-
-
-

4.1.1 (2017-11-04)

-
    -
  • Rebuild with Cython 0.27.3 to improve support for Py3.7.
  • -
-
-
-

4.1.0 (2017-10-13)

-
-

Features added

-
    -
  • ElementPath supports text predicates for current node, like "[.='text']".
  • -
  • ElementPath allows spaces in predicates.
  • -
  • Custom Element classes and XPath functions can now be registered with a -decorator rather than explicit dict assignments.
  • -
  • Static Linux wheels are now built with link time optimisation (LTO) enabled. -This should have a beneficial impact on the overall performance by providing -a tighter compiler integration between lxml and libxml2/libxslt.
  • -
-
-
-

Bugs fixed

-
    -
  • LP#1722776: Requesting non-Element objects like comments from a document with -PythonElementClassLookup could fail with a TypeError.
  • -
-
-
-
-

4.0.0 (2017-09-17)

-
-

Features added

-
    -
  • The ElementPath implementation is now compiled using Cython, -which speeds up the .find*() methods quite significantly.
  • -
  • The modules lxml.builder, lxml.html.diff and lxml.html.clean -are also compiled using Cython in order to speed them up.
  • -
  • xmlfile() supports async coroutines using async with and await.
  • -
  • iterwalk() has a new method skip_subtree() that prevents walking into -the descendants of the current element.
  • -
  • RelaxNG.from_rnc_string() accepts a base_url argument to -allow relative resource lookups.
  • -
  • The XSLT result object has a new method .write_output(file) that serialises -output data into a file according to the <xsl:output> configuration.
  • -
-
-
-

Bugs fixed

-
    -
  • GH#251: HTML comments were handled incorrectly by the soupparser. -Patch by mozbugbox.

    -
  • -
  • LP#1654544: The html5parser no longer passes the useChardet option -if the input is a Unicode string, unless explicitly requested. When parsing -files, the default is to enable it when a URL or file path is passed (because -the file is then opened in binary mode), and to disable it when reading from -a file(-like) object.

    -

    Note: This is a backwards incompatible change of the default configuration. -If your code parses byte strings/streams and depends on character detection, -please pass the option guess_charset=True explicitly, which already worked -in older lxml versions.

    -
  • -
  • LP#1703810: etree.fromstring() failed to parse UTF-32 data with BOM.

    -
  • -
  • LP#1526522: Some RelaxNG errors were not reported in the error log.

    -
  • -
  • LP#1567526: Empty and plain text input raised a TypeError in soupparser.

    -
  • -
  • LP#1710429: Uninitialised variable usage in HTML diff.

    -
  • -
  • LP#1415643: The closing tags context manager in xmlfile() could continue -to output end tags even after writing failed with an exception.

    -
  • -
  • LP#1465357: xmlfile.write() now accepts and ignores None as input argument.

    -
  • -
  • Compilation under Py3.7-pre failed due to a modified function signature.

    -
  • -
-
-
-

Other changes

-
    -
  • The main module source files were renamed from lxml.*.pyx to plain -*.pyx (e.g. etree.pyx) to simplify their handling in the build -process. Care was taken to keep the old header files as fallbacks for -code that compiles against the public C-API of lxml, but it might still -be worth validating that third-party code does not notice this change.
  • -
-
-
-
-

3.8.0 (2017-06-03)

-
-

Features added

-
    -
  • ElementTree.write() has a new option doctype that writes out a -doctype string before the serialisation, in the same way as tostring().
  • -
  • GH#220: xmlfile allows switching output methods at an element level. -Patch by Burak Arslan.
  • -
  • LP#1595781, GH#240: added a PyCapsule Python API and C-level API for -passing externally generated libxml2 documents into lxml.
  • -
  • GH#244: error log entries have a new property path with an XPath -expression (if known, None otherwise) that points to the tree element -responsible for the error. Patch by Bob Kline.
  • -
  • The namespace prefix mapping that can be used in ElementPath now injects -a default namespace when passing a None prefix.
  • -
-
-
-

Bugs fixed

-
    -
  • GH#238: Character escapes were not hex-encoded in the xmlfile serialiser. -Patch by matejcik.
  • -
  • GH#229: fix for externally created XML documents. Patch by Theodore Dubois.
  • -
  • LP#1665241, GH#228: Form data handling in lxml.html no longer strips the -option values specified in form attributes but only the text values. -Patch by Ashish Kulkarni.
  • -
  • LP#1551797: revert previous fix for XSLT error logging as it breaks -multi-threaded XSLT processing.
  • -
  • LP#1673355, GH#233: fromstring() html5parser failed to parse byte strings.
  • -
-
-
-

Other changes

-
    -
  • The previously undocumented docstring option in ElementTree.write() -produces a deprecation warning and will eventually be removed.
  • -
-
-
-
-

3.7.4 (2017-??-??)

-
-

Bugs fixed

-
    -
  • LP#1551797: revert previous fix for XSLT error logging as it breaks -multi-threaded XSLT processing.
  • -
  • LP#1673355, GH#233: fromstring() html5parser failed to parse byte strings.
  • -
-
-
-
-

3.7.3 (2017-02-18)

-
-

Bugs fixed

-
    -
  • GH#218 was ineffective in Python 3.
  • -
  • GH#222: lxml.html.submit_form() failed in Python 3. -Patch by Jakub Wilk.
  • -
-
-
-
-

3.7.2 (2017-01-08)

-
    -
  • GH#220: xmlfile allows switching output methods at an element level. -Patch by Burak Arslan.
  • -
-
-

Bugs fixed

-
    -
  • Work around installation problems in recent Python 2.7 versions -due to FTP download failures.
  • -
  • GH#219: xmlfile.element() was not properly quoting attribute values. -Patch by Burak Arslan.
  • -
  • GH#218: xmlfile.element() was not properly escaping text content of -script/style tags. Patch by Burak Arslan.
  • -
-
-
-
-

3.7.1 (2016-12-23)

-
    -
  • No source changes, issued only to solve problems with the -binary packages released for 3.7.0.
  • -
-
-
-

3.7.0 (2016-12-10)

-
-

Features added

-
    -
  • GH#217: XMLSyntaxError now behaves more like its SyntaxError -baseclass. Patch by Philipp A.
  • -
  • GH#216: HTMLParser() now supports the same collect_ids parameter -as XMLParser(). Patch by Burak Arslan.
  • -
  • GH#210: Allow specifying a serialisation method in xmlfile.write(). -Patch by Burak Arslan.
  • -
  • GH#203: New option default_doctype in HTMLParser that allows -disabling the automatic doctype creation. Patch by Shadab Zafar.
  • -
  • GH#201: Calling the method .set('attrname') without value argument -(or None) on HTML elements creates an attribute without value that -serialises like <div attrname></div>. Patch by Daniel Holth.
  • -
  • GH#197: Ignore form input fields in form_values() when they are -marked as disabled in HTML. Patch by Kristian Klemon.
  • -
-
-
-

Bugs fixed

-
    -
  • GH#206: File name and line number were missing from XSLT error messages. -Patch by Marcus Brinkmann.
  • -
-
-
-

Other changes

-
    -
  • Log entries no longer allow anything but plain string objects as message text -and file name.
  • -
  • zlib is included in the list of statically built libraries.
  • -
-
-
-
-

3.6.4 (2016-08-20)

- -
-
-

3.6.3 (2016-08-18)

-
    -
  • LP#1614603: change linker flags to build multi-linux wheels
  • -
-
-
-

3.6.2 (2016-08-18)

-
    -
  • LP#1614603: release without source changes to provide cleanly built Linux wheels
  • -
-
-
-

3.6.1 (2016-07-24)

-
-

Features added

-
    -
  • GH#180: Separate option inline_style for Cleaner that only removes style -attributes instead of all styles. Patch by Christian Pedersen.
  • -
  • GH#196: Windows build support for Python 3.5. Contribution by Maximilian Hils.
  • -
-
-
-

Bugs fixed

-
    -
  • GH#199: Exclude file fields from FormElement.form_values (as browsers do). -Patch by Tomas Divis.
  • -
  • GH#198, LP#1568167: Try to provide base URL from Resolver.resolve_string(). -Patch by Michael van Tellingen.
  • -
  • GH#191: More accurate float serialisation in objectify.FloatElement. -Patch by Holger Joukl.
  • -
  • LP#1551797: Repair XSLT error logging. Patch by Marcus Brinkmann.
  • -
-
-
-
-

3.6.0 (2016-03-17)

-
-

Features added

-
    -
  • GH#187: Now supports (only) version 5.x and later of PyPy. -Patch by Armin Rigo.
  • -
  • GH#181: Direct support for .rnc files in RelaxNG() if rnc2rng -is installed. Patch by Dirkjan Ochtman.
  • -
-
-
-

Bugs fixed

-
    -
  • GH#189: Static builds honour FTP proxy configurations when downloading -the external libs. Patch by Youhei Sakurai.
  • -
  • GH#186: Soupparser failed to process entities in Python 3.x. -Patch by Duncan Morris.
  • -
  • GH#185: Rare encoding related TypeError on import was fixed. -Patch by Petr Demin.
  • -
-
-
-
-

3.5.0 (2015-11-13)

-
-

Bugs fixed

-
    -
  • Unicode string results failed XPath queries in PyPy.
  • -
  • LP#1497051: HTML target parser failed to terminate on exceptions -and continued parsing instead.
  • -
  • Deprecated API usage in doctestcompare.
  • -
-
-
-
-

3.5.0b1 (2015-09-18)

-
-

Features added

-
    -
  • cleanup_namespaces() accepts a new argument keep_ns_prefixes -that does not remove definitions of the provided prefix-namespace -mapping from the tree.
  • -
  • cleanup_namespaces() accepts a new argument top_nsmap that -moves definitions of the provided prefix-namespace mapping to the -top of the tree.
  • -
  • LP#1490451: Element objects gained a cssselect() method as -known from lxml.html. Patch by Simon Sapin.
  • -
  • API functions and methods behave and look more like Python functions, -which allows introspection on them etc. One side effect to be aware of -is that the functions now bind as methods when assigned to a class -variable. A quick fix is to wrap them in staticmethod() (as for -normal Python functions).
  • -
  • ISO-Schematron support gained an option error_finder that allows -passing a filter function for picking validation errors from reports.
  • -
  • LP#1243600: Elements in lxml.html gained a classes property -that provides a set-like interface to the class attribute. -Original patch by masklinn.
  • -
  • LP#1341964: The soupparser now handles DOCTYPE declarations, comments -and processing instructions outside of the root element. -Patch by Olli Pottonen.
  • -
  • LP#1421512: The docinfo of a tree was made editable to allow -setting and removing the public ID and system ID of the DOCTYPE. -Patch by Olli Pottonen.
  • -
  • LP#1442427: More work-arounds for quirks and bugs in pypy and pypy3.
  • -
  • lxml.html.soupparser now uses BeautifulSoup version 4 instead -of version 3 if available.
  • -
-
-
-

Bugs fixed

-
    -
  • Memory errors that occur during tree adaptations (e.g. moving subtrees -to foreign documents) could leave the tree in a crash prone state.
  • -
  • Calling process_children() in an XSLT extension element without -an output_parent argument failed with a TypeError. -Fix by Jens Tröger.
  • -
  • GH#162: Image data in HTML data URLs is considered safe and -no longer removed by lxml.html.clean JavaScript cleaner.
  • -
  • GH#166: Static build could link libraries in wrong order.
  • -
  • GH#172: Rely a bit more on libxml2 for encoding detection rather than -rolling our own in some cases. Patch by Olli Pottonen.
  • -
  • GH#159: Validity checks for names and string content were tightened -to detect the use of illegal characters early. Patch by Olli Pottonen.
  • -
  • LP#1421921: Comments/PIs before the DOCTYPE declaration were not -serialised. Patch by Olli Pottonen.
  • -
  • LP#659367: Some HTML DOCTYPE declarations were not serialised. -Patch by Olli Pottonen.
  • -
  • LP#1238503: lxml.doctestcompare is now consistent with stdlib's doctest -in how it uses + and - to refer to unexpected and missing output.
  • -
  • Empty prefixes are explicitly rejected when a namespace mapping is used -with ElementPath to avoid hiding bugs in user code.
  • -
  • Several problems with PyPy were fixed by switching to Cython 0.23.
  • -
-
-
-
-

3.4.4 (2015-04-25)

-
-

Bugs fixed

-
    -
  • An ElementTree compatibility test added in lxml 3.4.3 that failed in -Python 3.4+ was removed again.
  • -
-
-
-
-

3.4.3 (2015-04-15)

-
-

Bugs fixed

-
    -
  • Expression cache in ElementPath was ignored. Fix by Changaco.
  • -
  • LP#1426868: Passing a default namespace and a prefixed namespace mapping -as nsmap into xmlfile.element() raised a TypeError.
  • -
  • LP#1421927: DOCTYPE system URLs were incorrectly quoted when containing -double quotes. Patch by Olli Pottonen.
  • -
  • LP#1419354: meta-redirect URLs were incorrectly processed by -iterlinks() if preceded by whitespace.
  • -
-
-
-
-

3.4.2 (2015-02-07)

-
-

Bugs fixed

-
    -
  • LP#1415907: Crash when creating an XMLSchema from a non-root element -of an XML document.
  • -
  • LP#1369362: HTML cleaning failed when hitting processing instructions -with pseudo-attributes.
  • -
  • CDATA() wrapped content was rejected for tail text.
  • -
  • CDATA sections were not serialised as tail text of the top-level element.
  • -
-
-
-
-

3.4.1 (2014-11-20)

-
-

Features added

-
    -
  • New htmlfile HTML generator to accompany the incremental xmlfile -serialisation API. Patch by Burak Arslan.
  • -
-
-
-

Bugs fixed

-
    -
  • lxml.sax.ElementTreeContentHandler did not initialise its superclass.
  • -
-
-
-
-

3.4.0 (2014-09-10)

-
-

Features added

-
    -
  • xmlfile(buffered=False) disables output buffering and flushes the -content after each API operation (starting/ending element blocks or writes). -A new method xf.flush() can alternatively be used to explicitly flush -the output.
  • -
  • lxml.html.document_fromstring has a new option ensure_head_body=True -which will add an empty head and/or body element to the result document if -missing.
  • -
  • lxml.html.iterlinks now returns links inside meta refresh tags.
  • -
  • New XMLParser option collect_ids=False to disable ID hash table -creation. This can substantially speed up parsing of documents with many -different IDs that are not used.
  • -
  • The parser uses per-document hash tables for XML IDs. This reduces the -load of the global parser dict and speeds up parsing for documents with -many different IDs.
  • -
  • ElementTree.getelementpath(element) returns a structural ElementPath -expression for the given element, which can be used for lookups later.
  • -
  • xmlfile() accepts a new argument close=True to close file(-like) -objects after writing to them. Before, xmlfile() only closed the file -if it had opened it internally.
  • -
  • Allow "bytearray" type for ASCII text input.
  • -
-
-
-

Bugs fixed

-
-
-

Other changes

-
    -
  • LP#400588: decoding errors have become hard errors even in recovery mode. -Previously, they could lead to an internal tree representation in a mixed -encoding state, which lead to very late errors or even silently incorrect -behaviour during tree traversal or serialisation.
  • -
  • Requires Python 2.6, 2.7, 3.2 or later. No longer supports -Python 2.4, 2.5 and 3.1, use lxml 3.3.x for those.
  • -
  • Requires libxml2 2.7.0 or later and libxslt 1.1.23 or later, -use lxml 3.3.x with older versions.
  • -
-
-
-
-

3.3.6 (2014-08-28)

-
-

Bugs fixed

-
    -
  • Prevent tree cycle creation when adding Elements as siblings.
  • -
  • LP#1361948: crash when deallocating Element siblings without parent.
  • -
  • LP#1354652: crash when traversing internally loaded documents in XSLT -extension functions.
  • -
-
-
-
-

3.3.5 (2014-04-18)

-
-

Bugs fixed

-
    -
  • HTML cleaning could fail to strip javascript links that mix control -characters into the link scheme.
  • -
-
-
-
-

3.3.4 (2014-04-03)

-
-

Features added

-
    -
  • Source line numbers above 65535 are available on Elements when -using libxml2 2.9 or later.
  • -
-
-
-

Bugs fixed

-
    -
  • lxml.html.fragment_fromstring() failed for bytes input in Py3.
  • -
-
-
-

Other changes

-
-
-
-

3.3.3 (2014-03-04)

-
-

Bugs fixed

-
    -
  • LP#1287118: Crash when using Element subtypes with __slots__.
  • -
-
-
-

Other changes

-
    -
  • The internal classes _LogEntry and _Attrib can no longer be -subclassed from Python code.
  • -
-
-
-
-

3.3.2 (2014-02-26)

-
-

Bugs fixed

-
    -
  • The properties resolvers and version, as well as the methods -set_element_class_lookup() and makeelement(), were lost from -iterparse objects in 3.3.0.
  • -
  • LP#1222132: instances of XMLSchema, Schematron and RelaxNG -did not clear their local error_log before running a validation.
  • -
  • LP#1238500: lxml.doctestcompare mixed up "expected" and "actual" in -attribute values.
  • -
  • Some file I/O tests were failing in MS-Windows due to non-portable temp -file usage. Initial patch by Gabi Davar.
  • -
  • LP#910014: duplicate IDs in a document were not reported by DTD validation.
  • -
  • LP#1185332: tostring(method="html") did not use HTML serialisation -semantics for trailing tail text. Initial patch by Sylvain Viollon.
  • -
  • LP#1281139: .attrib value of Comments lost its mutation methods -in 3.3.0. Even though it is empty and immutable, it should still -provide the same interface as that returned for Elements.
  • -
-
-
-
-

3.3.1 (2014-02-12)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • LP#1014290: HTML documents parsed with parser.feed() failed to find -elements during tag iteration.
  • -
  • LP#1273709: Building in PyPy failed due to missing support for -PyUnicode_Compare() and PyByteArray_*() in PyPy's C-API.
  • -
  • LP#1274413: Compilation in MSVC failed due to missing "stdint.h" standard -header file.
  • -
  • LP#1274118: iterparse() failed to parse BOM prefixed files.
  • -
-
-
-

Other changes

-
-
-
-

3.3.0 (2014-01-26)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • The heuristic that distinguishes file paths from URLs was tightened -to produce less false negatives.
  • -
-
-
-

Other changes

-
-
-
-

3.3.0beta5 (2014-01-18)

-
-

Features added

-
    -
  • The PEP 393 unicode parsing support gained a fallback for wchar strings -which might still be somewhat common on Windows systems.
  • -
-
-
-

Bugs fixed

-
    -
  • Several error handling problems were fixed throughout the code base that -could previously lead to exceptions being silently swallowed or not -properly reported.
  • -
  • The C-API function appendChild() is now deprecated as it does not -propagate exceptions (its return type is void). The new function -appendChildToElement() was added as a safe replacement.
  • -
  • Passing a string into fromstringlist() raises an exception instead of -parsing the string character by character.
  • -
-
-
-

Other changes

-
    -
  • Document cleanup code was simplified using the new GC features in -Cython 0.20.
  • -
-
-
-
-

3.3.0beta4 (2014-01-12)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • The (empty) value returned by the attrib property of Entity and Comment -objects was mutable.
  • -
  • Element class lookup wasn't available for the new pull parsers or when using -a custom parser target.
  • -
  • Setting Element attributes on instantiation with both the attrib argument -and keyword arguments could modify the mapping passed as attrib.
  • -
  • LP#1266171: DTDs instantiated from internal/external subsets (i.e. through -the docinfo property) lost their attribute declarations.
  • -
-
-
-

Other changes

-
    -
  • Built with Cython 0.20pre (gitrev 012ae82eb) to prepare support for -Python 3.4.
  • -
-
-
-
-

3.3.0beta3 (2014-01-02)

-
-

Features added

-
    -
  • Unicode string parsing was optimised for Python 3.3 (PEP 393).
  • -
-
-
-

Bugs fixed

-
    -
  • HTML parsing of Unicode strings could misdecode the input on some platforms.
  • -
  • Crash in xmlfile() when closing open elements out of order in an error case.
  • -
-
-
-

Other changes

-
-
-
-

3.3.0beta2 (2013-12-20)

-
-

Features added

-
    -
  • iterparse() supports the recover option.
  • -
-
-
-

Bugs fixed

-
    -
  • Crash in iterparse() for HTML parsing.
  • -
  • Crash in target parsing with attributes.
  • -
-
-
-

Other changes

-
    -
  • The safety check in the read-only tree implementation (e.g. used by -PythonElementClassLookup) raises a more appropriate ReferenceError -for illegal access after tree disposal instead of an AssertionError. -This should only impact test code that specifically checks the original -behaviour.
  • -
-
-
-
-

3.3.0beta1 (2013-12-12)

-
-

Features added

-
    -
  • New option handle_failures in make_links_absolute() and -resolve_base_href() (lxml.html) that enables ignoring or -discarding links that fail to parse as URLs.
  • -
  • New parser classes XMLPullParser and HTMLPullParser for -incremental parsing, as implemented for ElementTree in Python 3.4.
  • -
  • iterparse() enables recovery mode by default for HTML parsing -(html=True).
  • -
-
-
-

Bugs fixed

-
    -
  • LP#1255132: crash when trying to run validation over non-Element (e.g. -comment or PI).
  • -
  • Error messages in the log and in exception messages that originated -from libxml2 could accidentally be picked up from preceding warnings -instead of the actual error.
  • -
  • The ElementMaker in lxml.objectify did not accept a dict as -argument for adding attributes to the element it's building. This -works as in lxml.builder now.
  • -
  • LP#1228881: repr(XSLTAccessControl) failed in Python 3.
  • -
  • Raise ValueError when trying to append an Element to itself or -to one of its own descendants, instead of running into an infinite -loop.
  • -
  • LP#1206077: htmldiff discarded whitespace from the output.
  • -
  • Compressed plain-text serialisation to file-like objects was broken.
  • -
  • lxml.html.formfill: Fix textarea form filling. -The textarea used to be cleared before the new content was set, -which removed the name attribute.
  • -
-
-
-

Other changes

-
    -
  • Some basic API classes use freelists internally for faster -instantiation. This can speed up some iterparse() scenarios, -for example.
  • -
  • iterparse() was rewritten to use the new *PullParser -classes internally instead of being a parser itself.
  • -
-
-
-
-

3.2.5 (2014-01-02)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • Crash in xmlfile() when closing open elements out of order in an error case.
  • -
  • Crash in target parsing with attributes.
  • -
  • LP#1255132: crash when trying to run validation over non-Element (e.g. -comment or PI).
  • -
-
-
-

Other changes

-
-
-
-

3.2.4 (2013-11-07)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • Memory leak when creating an XPath evaluator in a thread.
  • -
  • LP#1228881: repr(XSLTAccessControl) failed in Python 3.
  • -
  • Raise ValueError when trying to append an Element to itself or -to one of its own descendants.
  • -
  • LP#1206077: htmldiff discarded whitespace from the output.
  • -
  • Compressed plain-text serialisation to file-like objects was broken.
  • -
-
-
-

Other changes

-
-
-
-

3.2.3 (2013-07-28)

-
-

Bugs fixed

-
    -
  • Fix support for Python 2.4 which was lost in 3.2.2.
  • -
-
-
-
-

3.2.2 (2013-07-28)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • LP#1185701: spurious XMLSyntaxError after finishing iterparse().
  • -
  • Crash in lxml.objectify during xsi annotation.
  • -
-
-
-

Other changes

-
    -
  • Return values of user provided element class lookup methods are now -validated against the type of the XML node they represent to prevent -API class mismatches.
  • -
-
-
-
-

3.2.1 (2013-05-11)

-
-

Features added

-
    -
  • The methods apply_templates() and process_children() of XSLT -extension elements have gained two new boolean options elements_only -and remove_blank_text that discard either all strings or whitespace-only -strings from the result list.
  • -
-
-
-

Bugs fixed

-
    -
  • When moving Elements to another tree, the namespace cleanup mechanism -no longer drops namespace prefixes from attributes for which it finds -a default namespace declaration, to prevent them from appearing as -unnamespaced attributes after serialisation.
  • -
  • Returning non-type objects from a custom class lookup method could lead -to a crash.
  • -
  • Instantiating and using subtypes of Comments and ProcessingInstructions -crashed.
  • -
-
-
-

Other changes

-
-
-
-

3.2.0 (2013-04-28)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • LP#690319: Leading whitespace could change the behaviour of the string -parsing functions in lxml.html.
  • -
  • LP#599318: The string parsing functions in lxml.html are more robust -in the face of uncommon HTML content like framesets or missing body tags. -Patch by Stefan Seelmann.
  • -
  • LP#712941: I/O errors while trying to access files with paths that contain -non-ASCII characters could raise UnicodeDecodeError instead of properly -reporting the IOError.
  • -
  • LP#673205: Parsing from in-memory strings disabled network access in the -default parser and made subsequent attempts to parse from a URL fail.
  • -
  • LP#971754: lxml.html.clean appends 'nofollow' to 'rel' attributes instead -of overwriting the current value.
  • -
  • LP#715687: lxml.html.clean no longer discards scripts that are explicitly -allowed by the user provided whitelist. Patch by Christine Koppelt.
  • -
-
-
-

Other changes

-
-
-
-

3.1.2 (2013-04-12)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • LP#1136509: Passing attributes through the namespace-unaware API of -the sax bridge (i.e. the handler.startElement() method) failed -with a TypeError. Patch by Mike Bayer.
  • -
  • LP#1123074: Fix serialisation error in XSLT output when converting -the result tree to a Unicode string.
  • -
  • GH#105: Replace illegal usage of xmlBufLength() in libxml2 2.9.0 -by properly exported API function xmlBufUse().
  • -
-
-
-

Other changes

-
-
-
-

3.1.1 (2013-03-29)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • LP#1160386: Write access to lxml.html.FormElement.fields raised -an AttributeError in Py3.
  • -
  • Illegal memory access during cleanup in incremental xmlfile writer.
  • -
-
-
-

Other changes

-
    -
  • The externally useless class lxml.etree._BaseParser was removed -from the module dict.
  • -
-
-
-
-

3.1.0 (2013-02-10)

-
-

Features added

-
    -
  • GH#89: lxml.html.clean allows overriding the set of attributes that it -considers 'safe'. Patch by Francis Devereux.
  • -
-
-
-

Bugs fixed

-
    -
  • LP#1104370: copy.copy(el.attrib) raised an exception. It now returns -a copy of the attributes as a plain Python dict.
  • -
  • GH#95: When used with namespace prefixes, the el.find*() methods -always used the first namespace mapping that was provided for each -path expression instead of using the one that was actually passed -in for the current run.
  • -
  • LP#1092521, GH#91: Fix undefined C symbol in Python runtimes compiled -without threading support. Patch by Ulrich Seidl.
  • -
-
-
-

Other changes

-
-
-
-

3.1beta1 (2012-12-21)

-
-

Features added

-
    -
  • New build-time option --with-unicode-strings for Python 2 that -makes the API always return Unicode strings for names and text -instead of byte strings for plain ASCII content.
  • -
  • New incremental XML file writing API etree.xmlfile().
  • -
  • E factory in lxml.objectify is callable to simplify the creation of -tags with non-identifier names without having to resort to getattr().
  • -
-
-
-

Bugs fixed

-
    -
  • When starting from a non-namespaced element in lxml.objectify, searching -for a child without explicitly specifying a namespace incorrectly found -namespaced elements with the requested local name, instead of restricting -the search to non-namespaced children.
  • -
  • GH#85: Deprecation warnings were fixed for Python 3.x.
  • -
  • GH#33: lxml.html.fromstring() failed to accept bytes input in Py3.
  • -
  • LP#1080792: Static build of libxml2 2.9.0 failed due to missing file.
  • -
-
-
-

Other changes

-
    -
  • The externally useless class _ObjectifyElementMakerCaller was -removed from the module API of lxml.objectify.
  • -
  • LP#1075622: lxml.builder is faster for adding text to elements with -many children. Patch by Anders Hammarquist.
  • -
-
-
-
-

3.0.2 (2012-12-14)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • Fix crash during interpreter shutdown by switching to Cython 0.17.3 for building.
  • -
-
-
-

Other changes

-
-
-
-

3.0.1 (2012-10-14)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • LP#1065924: Element proxies could disappear during garbage collection -in PyPy without proper cleanup.
  • -
  • GH#71: Failure to work with libxml2 2.6.x.
  • -
  • LP#1065139: static MacOS-X build failed in Py3.
  • -
-
-
-

Other changes

-
-
-
-

3.0 (2012-10-08)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • End-of-file handling was incorrect in iterparse() when reading from -a low-level C file stream and failed in libxml2 2.9.0 due to its -improved consistency checks.
  • -
-
-
-

Other changes

-
    -
  • The build no longer uses Cython by default unless the generated C files -are missing. To use Cython, pass the option "--with-cython". To ignore -the fatal build error when Cython is required but not available (e.g. to -run special setup.py commands that do not actually run a build), pass -"--without-cython".
  • -
-
-
-
-

3.0beta1 (2012-09-26)

-
-

Features added

-
    -
  • Python level access to (optional) libxml2 memory debugging features -to simplify debugging of memory leaks etc.
  • -
-
-
-

Bugs fixed

-
    -
  • Fix a memory leak in XPath by switching to Cython 0.17.1.
  • -
  • Some tests were adapted to work with PyPy.
  • -
-
-
-

Other changes

-
    -
  • The code was adapted to work with the upcoming libxml2 2.9.0 release.
  • -
-
-
-
-

3.0alpha2 (2012-08-23)

-
-

Features added

-
    -
  • The .iter() method of elements now accepts tag arguments like -"{*}name" to search for elements with a given local name in any -namespace. With this addition, all combinations of wildcards now work -as expected: -"{ns}name", "{}name", "{*}name", "{ns}*", "{}*" -and "{*}*". Note that "name" is equivalent to "{}name", -but "*" is "{*}*". -The same change applies to the .getiterator(), .itersiblings(), -.iterancestors(), .iterdescendants(), .iterchildren() -and .itertext() methods;the strip_attributes(), -strip_elements() and strip_tags() functions as well as the -iterparse() class. Patch by Simon Sapin.
  • -
  • C14N allows specifying the inclusive prefixes to be promoted -to top-level during exclusive serialisation.
  • -
-
-
-

Bugs fixed

-
    -
  • Passing long Unicode strings into the feed() parser interface -failed to read the entire string.
  • -
-
-
-

Other changes

-
-
-
-

3.0alpha1 (2012-07-31)

-
-

Features added

-
    -
  • Initial support for building in PyPy (through cpyext).
  • -
  • DTD objects gained an API that allows read access to their -declarations.
  • -
  • xpathgrep.py gained support for parsing line-by-line (e.g. -from grep output) and for surrounding the output with a new root -tag.
  • -
  • E-factory in lxml.builder accepts subtypes of known data -types (such as string subtypes) when building elements around them.
  • -
  • Tree iteration and iterparse() with a selective tag -argument supports passing a set of tags. Tree nodes will be -returned by the iterators if they match any of the tags.
  • -
-
-
-

Bugs fixed

-
    -
  • The .find*() methods in lxml.objectify no longer use XPath -internally, which makes them faster in many cases (especially when -short circuiting after a single or couple of elements) and fixes -some behavioural differences compared to lxml.etree. Note that -this means that they no longer support arbitrary XPath expressions -but only the subset that the ElementPath language supports. -The previous implementation was also redundant with the normal -XPath support, which can be used as a replacement.
  • -
  • el.find('*') could accidentally return a comment or processing -instruction that happened to be in the wrong spot. (Same for the -other .find*() methods.)
  • -
  • The error logging is less intrusive and avoids a global setup where -possible.
  • -
  • Fixed undefined names in html5lib parser.
  • -
  • xpathgrep.py did not work in Python 3.
  • -
  • Element.attrib.update() did not accept an attrib of -another Element as parameter.
  • -
  • For subtypes of ElementBase that make the .text or .tail -properties immutable (as in objectify, for example), inserting text -when creating Elements through the E-Factory feature of the class -constructor would fail with an exception, stating that the text -cannot be modified.
  • -
-
-
-

Other changes

-
    -
  • The code base was overhauled to properly use 'const' where the API -of libxml2 and libxslt requests it. This also has an impact on the -public C-API of lxml itself, as defined in etreepublic.pxd, as -well as the provided declarations in the lxml/includes/ directory. -Code that uses these declarations may have to be adapted. On the -plus side, this fixes several C compiler warnings, also for user -code, thus making it easier to spot real problems again.
  • -
  • The functionality of "lxml.cssselect" was moved into a separate PyPI -package called "cssselect". To continue using it, you must install -that package separately. The "lxml.cssselect" module is still -available and provides the same interface, provided the "cssselect" -package can be imported at runtime.
  • -
  • Element attributes passed in as an attrib dict or as keyword -arguments are now sorted by (namespaced) name before being created -to make their order predictable for serialisation and iteration. -Note that adding or deleting attributes afterwards does not take -that order into account, i.e. setting a new attribute appends it -after the existing ones.
  • -
  • Several classes that are for internal use only were removed -from the lxml.etree module dict: -_InputDocument, _ResolverRegistry, _ResolverContext, _BaseContext, -_ExsltRegExp, _IterparseContext, _TempStore, _ExceptionContext, -__ContentOnlyElement, _AttribIterator, _NamespaceRegistry, -_ClassNamespaceRegistry, _FunctionNamespaceRegistry, -_XPathFunctionNamespaceRegistry, _ParserDictionaryContext, -_FileReaderContext, _ParserContext, _PythonSaxParserTarget, -_TargetParserContext, _ReadOnlyProxy, _ReadOnlyPIProxy, -_ReadOnlyEntityProxy, _ReadOnlyElementProxy, _OpaqueNodeWrapper, -_OpaqueDocumentWrapper, _ModifyContentOnlyProxy, -_ModifyContentOnlyPIProxy, _ModifyContentOnlyEntityProxy, -_AppendOnlyElementProxy, _SaxParserContext, _FilelikeWriter, -_ParserSchemaValidationContext, _XPathContext, -_XSLTResolverContext, _XSLTContext, _XSLTQuotedStringParam
  • -
  • Several internal classes can no longer be inherited from: -_InputDocument, _ResolverRegistry, _ExsltRegExp, _ElementUnicodeResult, -_IterparseContext, _TempStore, _AttribIterator, _ClassNamespaceRegistry, -_XPathFunctionNamespaceRegistry, _ParserDictionaryContext, -_FileReaderContext, _PythonSaxParserTarget, _TargetParserContext, -_ReadOnlyPIProxy, _ReadOnlyEntityProxy, _OpaqueDocumentWrapper, -_ModifyContentOnlyPIProxy, _ModifyContentOnlyEntityProxy, -_AppendOnlyElementProxy, _FilelikeWriter, _ParserSchemaValidationContext, -_XPathContext, _XSLTResolverContext, _XSLTContext, _XSLTQuotedStringParam, -_XSLTResultTree, _XSLTProcessingInstruction
  • -
-
-
-
-

2.3.6 (2012-09-28)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • Passing long Unicode strings into the feed() parser interface -failed to read the entire string.
  • -
-
-
-

Other changes

-
-
-
-

2.3.5 (2012-07-31)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • Crash when merging text nodes in element.remove().
  • -
  • Crash in sax/target parser when reporting empty doctype.
  • -
-
-
-

Other changes

-
-
-
-

2.3.4 (2012-03-26)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • Crash when building an nsmap (Element property) with empty -namespace URIs.
  • -
  • Crash due to race condition when errors (or user messages) occur -during threaded XSLT processing.
  • -
  • XSLT stylesheet compilation could ignore compilation errors.
  • -
-
-
-

Other changes

-
-
-
-

2.3.3 (2012-01-04)

-
-

Features added

-
    -
  • lxml.html.tostring() gained new serialisation options -with_tail and doctype.
  • -
-
-
-

Bugs fixed

-
    -
  • Fixed a crash when using iterparse() for HTML parsing and -requesting start events.
  • -
  • Fixed parsing of more selectors in cssselect. Whitespace before -pseudo-elements and pseudo-classes is significant as it is a -descendant combinator. -"E :pseudo" should parse the same as "E *:pseudo", not "E:pseudo". -Patch by Simon Sapin.
  • -
  • lxml.html.diff no longer raises an exception when hitting -'img' tags without 'src' attribute.
  • -
-
-
-

Other changes

-
-
-
-

2.3.2 (2011-11-11)

-
-

Features added

-
    -
  • lxml.objectify.deannotate() has a new boolean option -cleanup_namespaces to remove the objectify namespace -declarations (and generally clean up the namespace declarations) -after removing the type annotations.
  • -
  • lxml.objectify gained its own SubElement() function as a -copy of etree.SubElement to avoid an otherwise redundant import -of lxml.etree on the user side.
  • -
-
-
-

Bugs fixed

-
    -
  • Fixed the "descendant" bug in cssselect a second time (after a first -fix in lxml 2.3.1). The previous change resulted in a serious -performance regression for the XPath based evaluation of the -translated expression. Note that this breaks the usage of some of -the generated XPath expressions as XSLT location paths that -previously worked in 2.3.1.
  • -
  • Fixed parsing of some selectors in cssselect. Whitespace after combinators -">", "+" and "~" is now correctly ignored. Previously it was parsed as -a descendant combinator. For example, "div> .foo" was parsed the same as -"div>* .foo" instead of "div>.foo". Patch by Simon Sapin.
  • -
-
-
-

Other changes

-
-
-
-

2.3.1 (2011-09-25)

-
-

Features added

-
    -
  • New option kill_tags in lxml.html.clean to remove specific -tags and their content (i.e. their whole subtree).
  • -
  • pi.get() and pi.attrib on processing instructions to parse -pseudo-attributes from the text content of processing instructions.
  • -
  • lxml.get_include() returns a list of include paths that can be -used to compile external C code against lxml.etree. This is -specifically required for statically linked lxml builds when code -needs to compile against the exact same header file versions as lxml -itself.
  • -
  • Resolver.resolve_file() takes an additional option -close_file that configures if the file(-like) object will be -closed after reading or not. By default, the file will be closed, -as the user is not expected to keep a reference to it.
  • -
-
-
-

Bugs fixed

-
    -
  • HTML cleaning didn't remove 'data:' links.
  • -
  • The html5lib parser integration now uses the 'official' -implementation in html5lib itself, which makes it work with newer -releases of the library.
  • -
  • In lxml.sax, endElementNS() could incorrectly reject a plain -tag name when the corresponding start event inferred the same plain -tag name to be in the default namespace.
  • -
  • When an open file-like object is passed into parse() or -iterparse(), the parser will no longer close it after use. This -reverts a change in lxml 2.3 where all files would be closed. It is -the users responsibility to properly close the file(-like) object, -also in error cases.
  • -
  • Assertion error in lxml.html.cleaner when discarding top-level elements.
  • -
  • In lxml.cssselect, use the xpath 'A//B' (short for -'A/descendant-or-self::node()/B') instead of 'A/descendant::B' for -the css descendant selector ('A B'). This makes a few edge cases -like "div *:last-child" consistent with the selector behavior in -WebKit and Firefox, and makes more css expressions valid location -paths (for use in xsl:template match).
  • -
  • In lxml.html, non-selected <option> tags no longer show up in the -collected form values.
  • -
  • Adding/removing <option> values to/from a multiple select form -field properly selects them and unselects them.
  • -
-
-
-

Other changes

-
    -
  • Static builds can specify the download directory with the ---download-dir option.
  • -
-
-
-
-

2.3 (2011-02-06)

-
-

Features added

-
    -
  • When looking for children, lxml.objectify takes '{}tag' as -meaning an empty namespace, as opposed to the parent namespace.
  • -
-
-
-

Bugs fixed

-
    -
  • When finished reading from a file-like object, the parser -immediately calls its .close() method.
  • -
  • When finished parsing, iterparse() immediately closes the input -file.
  • -
  • Work-around for libxml2 bug that can leave the HTML parser in a -non-functional state after parsing a severely broken document (fixed -in libxml2 2.7.8).
  • -
  • marque tag in HTML cleanup code is correctly named marquee.
  • -
-
-
-

Other changes

-
    -
  • Some public functions in the Cython-level C-API have more explicit -return types.
  • -
-
-
-
-

2.3beta1 (2010-09-06)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • Crash in newer libxml2 versions when moving elements between -documents that had attributes on replaced XInclude nodes.
  • -
  • XMLID() function was missing the optional parser and -base_url parameters.
  • -
  • Searching for wildcard tags in iterparse() was broken in Py3.
  • -
  • lxml.html.open_in_browser() didn't work in Python 3 due to the -use of os.tempnam. It now takes an optional 'encoding' parameter.
  • -
-
-
-

Other changes

-
-
-
-

2.3alpha2 (2010-07-24)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • Crash in XSLT when generating text-only result documents with a -stylesheet created in a different thread.
  • -
-
-
-

Other changes

-
    -
  • repr() of Element objects shows the hex ID with leading 0x -(following ElementTree 1.3).
  • -
-
-
-
-

2.3alpha1 (2010-06-19)

-
-

Features added

-
    -
  • Keyword argument namespaces in lxml.cssselect.CSSSelector() -to pass a prefix-to-namespace mapping for the selector.
  • -
  • New function lxml.etree.register_namespace(prefix, uri) that -globally registers a namespace prefix for a namespace that newly -created Elements in that namespace will use automatically. Follows -ElementTree 1.3.
  • -
  • Support 'unicode' string name as encoding parameter in -tostring(), following ElementTree 1.3.
  • -
  • Support 'c14n' serialisation method in ElementTree.write() and -tostring(), following ElementTree 1.3.
  • -
  • The ElementPath expression syntax (el.find*()) was extended to -match the upcoming ElementTree 1.3 that will ship in the standard -library of Python 3.2/2.7. This includes extended support for -predicates as well as namespace prefixes (as known from XPath).
  • -
  • During regular XPath evaluation, various ESXLT functions are -available within their namespace when using libxslt 1.1.26 or later.
  • -
  • Support passing a readily configured logger instance into -PyErrorLog, instead of a logger name.
  • -
  • On serialisation, the new doctype parameter can be used to -override the DOCTYPE (internal subset) of the document.
  • -
  • New parameter output_parent to XSLTExtension.apply_templates() -to append the resulting content directly to an output element.
  • -
  • XSLTExtension.process_children() to process the content of the -XSLT extension element itself.
  • -
  • ISO-Schematron support based on the de-facto Schematron reference -'skeleton implementation'.
  • -
  • XSLT objects now take XPath object as __call__ stylesheet -parameters.
  • -
  • Enable path caching in ElementPath (el.find*()) to avoid parsing -overhead.
  • -
  • Setting the value of a namespaced attribute always uses a prefixed -namespace instead of the default namespace even if both declare the -same namespace URI. This avoids serialisation problems when an -attribute from a default namespace is set on an element from a -different namespace.
  • -
  • XSLT extension elements: support for XSLT context nodes other than -elements: document root, comments, processing instructions.
  • -
  • Support for strings (in addition to Elements) in node-sets returned -by extension functions.
  • -
  • Forms that lack an action attribute default to the base URL of -the document on submit.
  • -
  • XPath attribute result strings have an attrname property.
  • -
  • Namespace URIs get validated against RFC 3986 at the API level -(required by the XML namespace specification).
  • -
  • Target parsers show their target object in the .target property -(compatible with ElementTree).
  • -
-
-
-

Bugs fixed

-
    -
  • API is hardened against invalid proxy instances to prevent crashes -due to incorrectly instantiated Element instances.
  • -
  • Prevent crash when instantiating CommentBase and friends.
  • -
  • Export ElementTree compatible XML parser class as -XMLTreeBuilder, as it is called in ET 1.2.
  • -
  • ObjectifiedDataElements in lxml.objectify were not hashable. They -now use the hash value of the underlying Python value (string, -number, etc.) to which they compare equal.
  • -
  • Parsing broken fragments in lxml.html could fail if the fragment -contained an orphaned closing '</div>' tag.
  • -
  • Using XSLT extension elements around the root of the output document -crashed.
  • -
  • lxml.cssselect did not distinguish between x[attr="val"] and -x [attr="val"] (with a space). The latter now matches the -attribute independent of the element.
  • -
  • Rewriting multiple links inside of HTML text content could end up -replacing unrelated content as replacements could impact the -reported position of subsequent matches. Modifications are now -simplified by letting the iterlinks() generator in lxml.html -return links in reversed order if they appear inside the same text -node. Thus, replacements and link-internal modifications no longer -change the position of links reported afterwards.
  • -
  • The .value attribute of textarea elements in lxml.html did -not represent the complete raw value (including child tags etc.). It -now serialises the complete content on read and replaces the -complete content by a string on write.
  • -
  • Target parser didn't call .close() on the target object if -parsing failed. Now it is guaranteed that .close() will be -called after parsing, regardless of the outcome.
  • -
-
-
-

Other changes

-
    -
  • Official support for Python 3.1.2 and later.
  • -
  • Static MS Windows builds can now download their dependencies -themselves.
  • -
  • Element.attrib no longer uses a cyclic reference back to its -Element object. It therefore no longer requires the garbage -collector to clean up.
  • -
  • Static builds include libiconv, in addition to libxml2 and libxslt.
  • -
-
-
-
-

2.2.8 (2010-09-02)

-
-

Bugs fixed

-
    -
  • Crash in newer libxml2 versions when moving elements between -documents that had attributes on replaced XInclude nodes.
  • -
  • Import fix for urljoin in Python 3.1+.
  • -
-
-
-
-

2.2.7 (2010-07-24)

-
-

Bugs fixed

-
    -
  • Crash in XSLT when generating text-only result documents with a -stylesheet created in a different thread.
  • -
-
-
-
-

2.2.6 (2010-03-02)

-
-

Bugs fixed

-
    -
  • Fixed several Python 3 regressions by building with Cython 0.11.3.
  • -
-
-
-
-

2.2.5 (2010-02-28)

-
-

Features added

-
    -
  • Support for running XSLT extension elements on the input root node -(e.g. in a template matching on "/").
  • -
-
-
-

Bugs fixed

-
    -
  • Crash in XPath evaluation when reading smart strings from a document -other than the original context document.
  • -
  • Support recent versions of html5lib by not requiring its -XHTMLParser in htmlparser.py anymore.
  • -
  • Manually instantiating the custom element classes in -lxml.objectify could crash.
  • -
  • Invalid XML text characters were not rejected by the API when they -appeared in unicode strings directly after non-ASCII characters.
  • -
  • lxml.html.open_http_urllib() did not work in Python 3.
  • -
  • The functions strip_tags() and strip_elements() in -lxml.etree did not remove all occurrences of a tag in all cases.
  • -
  • Crash in XSLT extension elements when the XSLT context node is not -an element.
  • -
-
-
-
-

2.2.4 (2009-11-11)

-
-

Bugs fixed

-
    -
  • Static build of libxml2/libxslt was broken.
  • -
-
-
-
-

2.2.3 (2009-10-30)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • The resolve_entities option did not work in the incremental feed -parser.
  • -
  • Looking up and deleting attributes without a namespace could hit a -namespaced attribute of the same name instead.
  • -
  • Late errors during calls to SubElement() (e.g. attribute related -ones) could leave a partially initialised element in the tree.
  • -
  • Modifying trees that contain parsed entity references could result -in an infinite loop.
  • -
  • ObjectifiedElement.__setattr__ created an empty-string child element when the -attribute value was rejected as a non-unicode/non-ascii string
  • -
  • Syntax errors in lxml.cssselect could result in misleading error -messages.
  • -
  • Invalid syntax in CSS expressions could lead to an infinite loop in -the parser of lxml.cssselect.
  • -
  • CSS special character escapes were not properly handled in -lxml.cssselect.
  • -
  • CSS Unicode escapes were not properly decoded in lxml.cssselect.
  • -
  • Select options in HTML forms that had no explicit value -attribute were not handled correctly. The HTML standard dictates -that their value is defined by their text content. This is now -supported by lxml.html.
  • -
  • XPath raised a TypeError when finding CDATA sections. This is now -fully supported.
  • -
  • Calling help(lxml.objectify) didn't work at the prompt.
  • -
  • The ElementMaker in lxml.objectify no longer defines the default -namespaces when annotation is disabled.
  • -
  • Feed parser failed to honour the 'recover' option on parse errors.
  • -
  • Diverting the error logging to Python's logging system was broken.
  • -
-
-
-

Other changes

-
-
-
-

2.2.2 (2009-06-21)

-
-

Features added

-
    -
  • New helper functions strip_attributes(), strip_elements(), -strip_tags() in lxml.etree to remove attributes/subtrees/tags -from a subtree.
  • -
-
-
-

Bugs fixed

-
    -
  • Namespace cleanup on subtree insertions could result in missing -namespace declarations (and potentially crashes) if the element -defining a namespace was deleted and the namespace was not used by -the top element of the inserted subtree but only in deeper subtrees.
  • -
  • Raising an exception from a parser target callback didn't always -terminate the parser.
  • -
  • Only {true, false, 1, 0} are accepted as the lexical representation for -BoolElement ({True, False, T, F, t, f} not any more), restoring lxml <= 2.0 -behaviour.
  • -
-
-
-

Other changes

-
-
-
-

2.2.1 (2009-06-02)

-
-

Features added

-
    -
  • Injecting default attributes into a document during XML Schema -validation (also at parse time).
  • -
  • Pass huge_tree parser option to disable parser security -restrictions imposed by libxml2 2.7.
  • -
-
-
-

Bugs fixed

-
    -
  • The script for statically building libxml2 and libxslt didn't work -in Py3.
  • -
  • XMLSchema() also passes invalid schema documents on to libxml2 -for parsing (which could lead to a crash before release 2.6.24).
  • -
-
-
-

Other changes

-
-
-
-

2.2 (2009-03-21)

-
-

Features added

-
    -
  • Support for standalone flag in XML declaration through -tree.docinfo.standalone and by passing standalone=True/False -on serialisation.
  • -
-
-
-

Bugs fixed

-
    -
  • Crash when parsing an XML Schema with external imports from a -filename.
  • -
-
-
-
-

2.2beta4 (2009-02-27)

-
-

Features added

-
    -
  • Support strings and instantiable Element classes as child arguments -to the constructor of custom Element classes.
  • -
  • GZip compression support for serialisation to files and file-like -objects.
  • -
-
-
-

Bugs fixed

-
    -
  • Deep-copying an ElementTree copied neither its sibling PIs and -comments nor its internal/external DTD subsets.
  • -
  • Soupparser failed on broken attributes without values.
  • -
  • Crash in XSLT when overwriting an already defined attribute using -xsl:attribute.
  • -
  • Crash bug in exception handling code under Python 3. This was due -to a problem in Cython, not lxml itself.
  • -
  • lxml.html.FormElement._name() failed for non top-level forms.
  • -
  • TAG special attribute in constructor of custom Element classes -was evaluated incorrectly.
  • -
-
-
-

Other changes

-
    -
  • Official support for Python 3.0.1.
  • -
  • Element.findtext() now returns an empty string instead of None -for Elements without text content.
  • -
-
-
-
-

2.2beta3 (2009-02-17)

-
-

Features added

-
    -
  • XSLT.strparam() class method to wrap quoted string parameters -that require escaping.
  • -
-
-
-

Bugs fixed

-
    -
  • Memory leak in XPath evaluators.
  • -
  • Crash when parsing indented XML in one thread and merging it with -other documents parsed in another thread.
  • -
  • Setting the base attribute in lxml.objectify from a unicode -string failed.
  • -
  • Fixes following changes in Python 3.0.1.
  • -
  • Minor fixes for Python 3.
  • -
-
-
-

Other changes

-
    -
  • The global error log (which is copied into the exception log) is now -local to a thread, which fixes some race conditions.
  • -
  • More robust error handling on serialisation.
  • -
-
-
-
-

2.2beta2 (2009-01-25)

-
-

Bugs fixed

-
    -
  • Potential memory leak on exception handling. This was due to a -problem in Cython, not lxml itself.
  • -
  • iter_links (and related link-rewriting functions) in -lxml.html would interpret CSS like url("link") incorrectly -(treating the quotation marks as part of the link).
  • -
  • Failing import on systems that have an io module.
  • -
-
-
-
-

2.1.5 (2009-01-06)

-
-

Bugs fixed

-
    -
  • Potential memory leak on exception handling. This was due to a -problem in Cython, not lxml itself.
  • -
  • Failing import on systems that have an io module.
  • -
-
-
-
-

2.2beta1 (2008-12-12)

-
-

Features added

-
    -
  • Allow lxml.html.diff.htmldiff to accept Element objects, not -just HTML strings.
  • -
-
-
-

Bugs fixed

-
    -
  • Crash when using an XPath evaluator in multiple threads.
  • -
  • Fixed missing whitespace before Link:... in lxml.html.diff.
  • -
-
-
-

Other changes

-
    -
  • Export lxml.html.parse.
  • -
-
-
-
-

2.1.4 (2008-12-12)

-
-

Bugs fixed

-
    -
  • Crash when using an XPath evaluator in multiple threads.
  • -
-
-
-
-

2.0.11 (2008-12-12)

-
-

Bugs fixed

-
    -
  • Crash when using an XPath evaluator in multiple threads.
  • -
-
-
-
-

2.2alpha1 (2008-11-23)

-
-

Features added

-
    -
  • Support for XSLT result tree fragments in XPath/XSLT extension -functions.
  • -
  • QName objects have new properties namespace and localname.
  • -
  • New options for exclusive C14N and C14N without comments.
  • -
  • Instantiating a custom Element classes creates a new Element.
  • -
-
-
-

Bugs fixed

-
    -
  • XSLT didn't inherit the parse options of the input document.
  • -
  • 0-bytes could slip through the API when used inside of Unicode -strings.
  • -
  • With lxml.html.clean.autolink, links with balanced parenthesis, -that end in a parenthesis, will be linked in their entirety (typical -with Wikipedia links).
  • -
-
-
-

Other changes

-
-
-
-

2.1.3 (2008-11-17)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • Ref-count leaks when lxml enters a try-except statement while an -outside exception lives in sys.exc_*(). This was due to a problem in -Cython, not lxml itself.
  • -
  • Parser Unicode decoding errors could get swallowed by other -exceptions.
  • -
  • Name/import errors in some Python modules.
  • -
  • Internal DTD subsets that did not specify a system or public ID were -not serialised and did not appear in the docinfo property of -ElementTrees.
  • -
  • Fix a pre-Py3k warning when parsing from a gzip file in Py2.6.
  • -
  • Test suite fixes for libxml2 2.7.
  • -
  • Resolver.resolve_string() did not work for non-ASCII byte strings.
  • -
  • Resolver.resolve_file() was broken.
  • -
  • Overriding the parser encoding didn't work for many encodings.
  • -
-
-
-

Other changes

-
-
-
-

2.0.10 (2008-11-17)

-
-

Bugs fixed

-
    -
  • Ref-count leaks when lxml enters a try-except statement while an -outside exception lives in sys.exc_*(). This was due to a problem in -Cython, not lxml itself.
  • -
-
-
-
-

2.1.2 (2008-09-05)

-
-

Features added

-
    -
  • lxml.etree now tries to find the absolute path name of files when -parsing from a file-like object. This helps custom resolvers when -resolving relative URLs, as lixbml2 can prepend them with the path -of the source document.
  • -
-
-
-

Bugs fixed

-
    -
  • Memory problem when passing documents between threads.
  • -
  • Target parser did not honour the recover option and raised an -exception instead of calling .close() on the target.
  • -
-
-
-

Other changes

-
-
-
-

2.0.9 (2008-09-05)

-
-

Bugs fixed

-
    -
  • Memory problem when passing documents between threads.
  • -
  • Target parser did not honour the recover option and raised an -exception instead of calling .close() on the target.
  • -
-
-
-
-

2.1.1 (2008-07-24)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • Crash when parsing XSLT stylesheets in a thread and using them in -another.
  • -
  • Encoding problem when including text with ElementInclude under -Python 3.
  • -
-
-
-

Other changes

-
-
-
-

2.0.8 (2008-07-24)

-
-

Features added

-
    -
  • lxml.html.rewrite_links() strips links to work around documents -with whitespace in URL attributes.
  • -
-
-
-

Bugs fixed

-
    -
  • Crash when parsing XSLT stylesheets in a thread and using them in -another.
  • -
  • CSS selector parser dropped remaining expression after a function -with parameters.
  • -
-
-
-

Other changes

-
-
-
-

2.1 (2008-07-09)

-
-

Features added

-
    -
  • Smart strings can be switched off in XPath (smart_strings -keyword option).
  • -
  • lxml.html.rewrite_links() strips links to work around documents -with whitespace in URL attributes.
  • -
-
-
-

Bugs fixed

-
    -
  • Custom resolvers were not used for XMLSchema includes/imports and -XInclude processing.
  • -
  • CSS selector parser dropped remaining expression after a function -with parameters.
  • -
-
-
-

Other changes

-
    -
  • objectify.enableRecursiveStr() was removed, use -objectify.enable_recursive_str() instead
  • -
  • Speed-up when running XSLTs on documents from other threads
  • -
-
-
-
-

2.0.7 (2008-06-20)

-
-

Features added

-
    -
  • Pickling ElementTree objects in lxml.objectify.
  • -
-
-
-

Bugs fixed

-
    -
  • Descending dot-separated classes in CSS selectors were not resolved -correctly.
  • -
  • ElementTree.parse() didn't handle target parser result.
  • -
  • Potential threading problem in XInclude.
  • -
  • Crash in Element class lookup classes when the __init__() method of -the super class is not called from Python subclasses.
  • -
-
-
-

Other changes

-
    -
  • Non-ASCII characters in attribute values are no longer escaped on -serialisation.
  • -
-
-
-
-

2.1beta3 (2008-06-19)

-
-

Features added

-
    -
  • Major overhaul of tools/xpathgrep.py script.
  • -
  • Pickling ElementTree objects in lxml.objectify.
  • -
  • Support for parsing from file-like objects that return unicode -strings.
  • -
  • New function etree.cleanup_namespaces(el) that removes unused -namespace declarations from a (sub)tree (experimental).
  • -
  • XSLT results support the buffer protocol in Python 3.
  • -
  • Polymorphic functions in lxml.html that accept either a tree or -a parsable string will return either a UTF-8 encoded byte string, a -unicode string or a tree, based on the type of the input. -Previously, the result was always a byte string or a tree.
  • -
  • Support for Python 2.6 and 3.0 beta.
  • -
  • File name handling now uses a heuristic to convert between byte -strings (usually filenames) and unicode strings (usually URLs).
  • -
  • Parsing from a plain file object frees the GIL under Python 2.x.
  • -
  • Running iterparse() on a plain file (or filename) frees the GIL -on reading under Python 2.x.
  • -
  • Conversion functions html_to_xhtml() and xhtml_to_html() in -lxml.html (experimental).
  • -
  • Most features in lxml.html work for XHTML namespaced tag names -(experimental).
  • -
-
-
-

Bugs fixed

-
    -
  • ElementTree.parse() didn't handle target parser result.
  • -
  • Crash in Element class lookup classes when the __init__() method of -the super class is not called from Python subclasses.
  • -
  • A number of problems related to unicode/byte string conversion of -filenames and error messages were fixed.
  • -
  • Building on MacOS-X now passes the "flat_namespace" option to the C -compiler, which reportedly prevents build quirks and crashes on this -platform.
  • -
  • Windows build was broken.
  • -
  • Rare crash when serialising to a file object with certain encodings.
  • -
-
-
-

Other changes

-
    -
  • Non-ASCII characters in attribute values are no longer escaped on -serialisation.
  • -
  • Passing non-ASCII byte strings or invalid unicode strings as .tag, -namespaces, etc. will result in a ValueError instead of an -AssertionError (just like the tag well-formedness check).
  • -
  • Up to several times faster attribute access (i.e. tree traversal) in -lxml.objectify.
  • -
-
-
-
-

2.0.6 (2008-05-31)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • Incorrect evaluation of el.find("tag[child]").
  • -
  • Windows build was broken.
  • -
  • Moving a subtree from a document created in one thread into a -document of another thread could crash when the rest of the source -document is deleted while the subtree is still in use.
  • -
  • Rare crash when serialising to a file object with certain encodings.
  • -
-
-
-

Other changes

-
    -
  • lxml should now build without problems on MacOS-X.
  • -
-
-
-
-

2.1beta2 (2008-05-02)

-
-

Features added

-
    -
  • All parse functions in lxml.html take a parser keyword argument.
  • -
  • lxml.html has a new parser class XHTMLParser and a module -attribute xhtml_parser that provide XML parsers that are -pre-configured for the lxml.html package.
  • -
-
-
-

Bugs fixed

-
    -
  • Moving a subtree from a document created in one thread into a -document of another thread could crash when the rest of the source -document is deleted while the subtree is still in use.
  • -
  • Passing an nsmap when creating an Element will no longer strip -redundantly defined namespace URIs. This prevented the definition -of more than one prefix for a namespace on the same Element.
  • -
-
-
-

Other changes

-
    -
  • If the default namespace is redundantly defined with a prefix on the -same Element, the prefix will now be preferred for subelements and -attributes. This allows users to work around a problem in libxml2 -where attributes from the default namespace could serialise without -a prefix even when they appear on an Element with a different -namespace (i.e. they would end up in the wrong namespace).
  • -
-
-
-
-

2.0.5 (2008-05-01)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • Resolving to a filename in custom resolvers didn't work.
  • -
  • lxml did not honour libxslt's second error state "STOPPED", which -let some XSLT errors pass silently.
  • -
  • Memory leak in Schematron with libxml2 >= 2.6.31.
  • -
-
-
-

Other changes

-
-
-
-

2.1beta1 (2008-04-15)

-
-

Features added

-
    -
  • Error logging in Schematron (requires libxml2 2.6.32 or later).
  • -
  • Parser option strip_cdata for normalising or keeping CDATA -sections. Defaults to True as before, thus replacing CDATA -sections by their text content.
  • -
  • CDATA() factory to wrap string content as CDATA section.
  • -
-
-
-

Bugs fixed

-
    -
  • Resolving to a filename in custom resolvers didn't work.
  • -
  • lxml did not honour libxslt's second error state "STOPPED", which -let some XSLT errors pass silently.
  • -
  • Memory leak in Schematron with libxml2 >= 2.6.31.
  • -
  • lxml.etree accepted non well-formed namespace prefix names.
  • -
-
-
-

Other changes

-
    -
  • Major cleanup in internal moveNodeToDocument() function, which -takes care of namespace cleanup when moving elements between -different namespace contexts.
  • -
  • New Elements created through the makeelement() method of an HTML -parser or through lxml.html now end up in a new HTML document -(doctype HTML 4.01 Transitional) instead of a generic XML document. -This mostly impacts the serialisation and the availability of a DTD -context.
  • -
-
-
-
-

2.0.4 (2008-04-13)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • Hanging thread in conjunction with GTK threading.
  • -
  • Crash bug in iterparse when moving elements into other documents.
  • -
  • HTML elements' .cssselect() method was broken.
  • -
  • ElementTree.find*() didn't accept QName objects.
  • -
-
-
-

Other changes

-
-
-
-

2.1alpha1 (2008-03-27)

-
-

Features added

-
    -
  • New event types 'comment' and 'pi' in iterparse().
  • -
  • XSLTAccessControl instances have a property options that -returns a dict of access configuration options.
  • -
  • Constant instances DENY_ALL and DENY_WRITE on -XSLTAccessControl class.
  • -
  • Extension elements for XSLT (experimental!)
  • -
  • Element.base property returns the xml:base or HTML base URL of -an Element.
  • -
  • docinfo.URL property is writable.
  • -
-
-
-

Bugs fixed

-
    -
  • Default encoding for plain text serialisation was different from -that of XML serialisation (UTF-8 instead of ASCII).
  • -
-
-
-

Other changes

-
    -
  • Minor API speed-ups.
  • -
  • The benchmark suite now uses tail text in the trees, which makes the -absolute numbers incomparable to previous results.
  • -
  • Generating the HTML documentation now requires Pygments, which is -used to enable syntax highlighting for the doctest examples.
  • -
-

Most long-time deprecated functions and methods were removed:

-
    -
  • etree.clearErrorLog(), use etree.clear_error_log()

    -
  • -
  • etree.useGlobalPythonLog(), use -etree.use_global_python_log()

    -
  • -
  • etree.ElementClassLookup.setFallback(), use -etree.ElementClassLookup.set_fallback()

    -
  • -
  • etree.getDefaultParser(), use etree.get_default_parser()

    -
  • -
  • etree.setDefaultParser(), use etree.set_default_parser()

    -
  • -
  • etree.setElementClassLookup(), use -etree.set_element_class_lookup()

    -

    Note that parser.setElementClassLookup() has not been removed -yet, although parser.set_element_class_lookup() should be used -instead.

    -
  • -
  • xpath_evaluator.registerNamespace(), use -xpath_evaluator.register_namespace()

    -
  • -
  • xpath_evaluator.registerNamespaces(), use -xpath_evaluator.register_namespaces()

    -
  • -
  • objectify.setPytypeAttributeTag, use -objectify.set_pytype_attribute_tag

    -
  • -
  • objectify.setDefaultParser(), use -objectify.set_default_parser()

    -
  • -
-
-
-
-

2.0.3 (2008-03-26)

-
-

Features added

-
    -
  • soupparser.parse() allows passing keyword arguments on to -BeautifulSoup.
  • -
  • fromstring() method in lxml.html.soupparser.
  • -
-
-
-

Bugs fixed

-
    -
  • lxml.html.diff didn't treat empty tags properly (e.g., -<br>).
  • -
  • Handle entity replacements correctly in target parser.
  • -
  • Crash when using iterparse() with XML Schema validation.
  • -
  • The BeautifulSoup parser (soupparser.py) did not replace entities, -which made them turn up in text content.
  • -
  • Attribute assignment of custom PyTypes in objectify could fail to -correctly serialise the value to a string.
  • -
-
-
-

Other changes

-
    -
  • lxml.html.ElementSoup was replaced by a new module -lxml.html.soupparser with a more consistent API. The old module -remains for compatibility with ElementTree's own ElementSoup module.
  • -
  • Setting the XSLT_CONFIG and XML2_CONFIG environment variables at -build time will let setup.py pick up the xml2-config and -xslt-config scripts from the supplied path name.
  • -
  • Passing --with-xml2-config=/path/to/xml2-config to setup.py will -override the xml2-config script that is used to determine the C -compiler options. The same applies for the --with-xslt-config -option.
  • -
-
-
-
-

2.0.2 (2008-02-22)

-
-

Features added

-
    -
  • Support passing base_url to file parser functions to override -the filename of the file(-like) object.
  • -
-
-
-

Bugs fixed

-
    -
  • The prefix for objectify's pytype namespace was missing from the set -of default prefixes.
  • -
  • Memory leak in Schematron (fixed only for libxml2 2.6.31+).
  • -
  • Error type names in RelaxNG were reported incorrectly.
  • -
  • Slice deletion bug fixed in objectify.
  • -
-
-
-

Other changes

-
    -
  • Enabled doctests for some Python modules (especially lxml.html).
  • -
  • Add a method argument to lxml.html.tostring() -(method="xml" for XHTML output).
  • -
  • Make it clearer that methods like lxml.html.fromstring() take a -base_url argument.
  • -
-
-
-
-

2.0.1 (2008-02-13)

-
-

Features added

-
    -
  • Child iteration in lxml.pyclasslookup.
  • -
  • Loads of new docstrings reflect the signature of functions and -methods to make them visible in API docs and help()
  • -
-
-
-

Bugs fixed

-
    -
  • The module lxml.html.builder was duplicated as -lxml.htmlbuilder
  • -
  • Form elements would return None for form.fields.keys() if there -was an unnamed input field. Now unnamed input fields are completely -ignored.
  • -
  • Setting an element slice in objectify could insert slice-overlapping -elements at the wrong position.
  • -
-
-
-

Other changes

-
    -
  • The generated API documentation was cleaned up and disburdened from -non-public classes etc.
  • -
  • The previously public module lxml.html.setmixin was renamed to -lxml.html._setmixin as it is not an official part of lxml. If -you want to use it, feel free to copy it over to your own source -base.
  • -
  • Passing --with-xslt-config=/path/to/xslt-config to setup.py will -override the xslt-config script that is used to determine the C -compiler options.
  • -
-
-
-
-

2.0 (2008-02-01)

-
-

Features added

-
    -
  • Passing the unicode type as encoding to tostring() will -serialise to unicode. The tounicode() function is now -deprecated.
  • -
  • XMLSchema() and RelaxNG() can parse from StringIO.
  • -
  • makeparser() function in lxml.objectify to create a new -parser with the usual objectify setup.
  • -
  • Plain ASCII XPath string results are no longer forced into unicode -objects as in 2.0beta1, but are returned as plain strings as before.
  • -
  • All XPath string results are 'smart' objects that have a -getparent() method to retrieve their parent Element.
  • -
  • with_tail option in serialiser functions.
  • -
  • More accurate exception messages in validator creation.
  • -
  • Parse-time XML schema validation (schema parser keyword).
  • -
  • XPath string results of the text() function and attribute -selection make their Element container accessible through a -getparent() method. As a side-effect, they are now always -unicode objects (even ASCII strings).
  • -
  • XSLT objects are usable in any thread - at the cost of a deep -copy if they were not created in that thread.
  • -
  • Invalid entity names and character references will be rejected by -the Entity() factory.
  • -
  • entity.text returns the textual representation of the entity, -e.g. &amp;.
  • -
  • New properties position and code on ParseError exception (as -in ET 1.3)
  • -
  • Rich comparison of element.attrib proxies.
  • -
  • ElementTree compatible TreeBuilder class.
  • -
  • Use default prefixes for some common XML namespaces.
  • -
  • lxml.html.clean.Cleaner now allows for a host_whitelist, and -two overridable methods: allow_embedded_url(el, url) and the -more general allow_element(el).
  • -
  • Extended slicing of Elements as in element[1:-1:2], both in -etree and in objectify
  • -
  • Resolvers can now provide a base_url keyword argument when -resolving a document as string data.
  • -
  • When using lxml.doctestcompare you can give the doctest option -NOPARSE_MARKUP (like # doctest: +NOPARSE_MARKUP) to suppress -the special checking for one test.
  • -
  • Separate feed_error_log property for the feed parser interface. -The normal parser interface and iterparse continue to use -error_log.
  • -
  • The normal parsers and the feed parser interface are now separated -and can be used concurrently on the same parser instance.
  • -
  • fromstringlist() and tostringlist() functions as in -ElementTree 1.3
  • -
  • iterparse() accepts an html boolean keyword argument for -parsing with the HTML parser (note that this interface may be -subject to change)
  • -
  • Parsers accept an encoding keyword argument that overrides the encoding -of the parsed documents.
  • -
  • New C-API function hasChild() to test for children
  • -
  • annotate() function in objectify can annotate with Python types and XSI -types in one step. Accompanied by xsiannotate() and pyannotate().
  • -
  • ET.write(), tostring() and tounicode() now accept a keyword -argument method that can be one of 'xml' (or None), 'html' or 'text' to -serialise as XML, HTML or plain text content.
  • -
  • iterfind() method on Elements returns an iterator equivalent to -findall()
  • -
  • itertext() method on Elements
  • -
  • Setting a QName object as value of the .text property or as an attribute -will resolve its prefix in the respective context
  • -
  • ElementTree-like parser target interface as described in -http://effbot.org/elementtree/elementtree-xmlparser.htm
  • -
  • ElementTree-like feed parser interface on XMLParser and HTMLParser -(feed() and close() methods)
  • -
  • Reimplemented objectify.E for better performance and improved -integration with objectify. Provides extended type support based on -registered PyTypes.
  • -
  • XSLT objects now support deep copying
  • -
  • New makeSubElement() C-API function that allows creating a new -subelement straight with text, tail and attributes.
  • -
  • XPath extension functions can now access the current context node -(context.context_node) and use a context dictionary -(context.eval_context) from the context provided in their first -parameter
  • -
  • HTML tag soup parser based on BeautifulSoup in lxml.html.ElementSoup
  • -
  • New module lxml.doctestcompare by Ian Bicking for writing simplified -doctests based on XML/HTML output. Use by importing lxml.usedoctest or -lxml.html.usedoctest from within a doctest.
  • -
  • New module lxml.cssselect by Ian Bicking for selecting Elements with CSS -selectors.
  • -
  • New package lxml.html written by Ian Bicking for advanced HTML -treatment.
  • -
  • Namespace class setup is now local to the ElementNamespaceClassLookup -instance and no longer global.
  • -
  • Schematron validation (incomplete in libxml2)
  • -
  • Additional stringify argument to objectify.PyType() takes a -conversion function to strings to support setting text values from arbitrary -types.
  • -
  • Entity support through an Entity factory and element classes. XML -parsers now have a resolve_entities keyword argument that can be set to -False to keep entities in the document.
  • -
  • column field on error log entries to accompany the line field
  • -
  • Error specific messages in XPath parsing and evaluation -NOTE: for evaluation errors, you will now get an XPathEvalError instead of -an XPathSyntaxError. To catch both, you can except on XPathError
  • -
  • The regular expression functions in XPath now support passing a node-set -instead of a string
  • -
  • Extended type annotation in objectify: new xsiannotate() function
  • -
  • EXSLT RegExp support in standard XPath (not only XSLT)
  • -
-
-
-

Bugs fixed

-
    -
  • Missing import in lxml.html.clean.
  • -
  • Some Python 2.4-isms prevented lxml from building/running under -Python 2.3.
  • -
  • XPath on ElementTrees could crash when selecting the virtual root -node of the ElementTree.
  • -
  • Compilation --without-threading was buggy in alpha5/6.
  • -
  • Memory leak in the parse() function.
  • -
  • Minor bugs in XSLT error message formatting.
  • -
  • Result document memory leak in target parser.
  • -
  • Target parser failed to report comments.
  • -
  • In the lxml.html iter_links method, links in <object> -tags weren't recognized. (Note: plugin-specific link parameters -still aren't recognized.) Also, the <embed> tag, though not -standard, is now included in lxml.html.defs.special_inline_tags.
  • -
  • Using custom resolvers on XSLT stylesheets parsed from a string -could request ill-formed URLs.
  • -
  • With lxml.doctestcompare if you do <tag xmlns="..."> in your -output, it will then be namespace-neutral (before the ellipsis was -treated as a real namespace).
  • -
  • AttributeError in feed parser on parse errors
  • -
  • XML feed parser setup problem
  • -
  • Type annotation for unicode strings in DataElement()
  • -
  • lxml failed to serialise namespace declarations of elements other than the -root node of a tree
  • -
  • Race condition in XSLT where the resolver context leaked between concurrent -XSLT calls
  • -
  • lxml.etree did not check tag/attribute names
  • -
  • The XML parser did not report undefined entities as error
  • -
  • The text in exceptions raised by XML parsers, validators and XPath -evaluators now reports the first error that occurred instead of the last
  • -
  • Passing '' as XPath namespace prefix did not raise an error
  • -
  • Thread safety in XPath evaluators
  • -
-
-
-

Other changes

-
    -
  • Exceptions carry only the part of the error log that is related to -the operation that caused the error.
  • -
  • XMLSchema() and RelaxNG() now enforce passing the source -file/filename through the file keyword argument.
  • -
  • The test suite now skips most doctests under Python 2.3.
  • -
  • make clean no longer removes the .c files (use make -realclean instead)
  • -
  • Minor performance tweaks for Element instantiation and subelement -creation
  • -
  • Various places in the XPath, XSLT and iteration APIs now require -keyword-only arguments.
  • -
  • The argument order in element.itersiblings() was changed to -match the order used in all other iteration methods. The second -argument ('preceding') is now a keyword-only argument.
  • -
  • The getiterator() method on Elements and ElementTrees was -reverted to return an iterator as it did in lxml 1.x. The ET API -specification allows it to return either a sequence or an iterator, -and it traditionally returned a sequence in ET and an iterator in -lxml. However, it is now deprecated in favour of the iter() -method, which should be used in new code wherever possible.
  • -
  • The 'pretty printed' serialisation of ElementTree objects now -inserts newlines at the root level between processing instructions, -comments and the root tag.
  • -
  • A 'pretty printed' serialisation is now terminated with a newline.
  • -
  • Second argument to lxml.etree.Extension() helper is no longer -required, third argument is now a keyword-only argument ns.
  • -
  • lxml.html.tostring takes an encoding argument.
  • -
  • The module source files were renamed to "lxml.*.pyx", such as -"lxml.etree.pyx". This was changed for consistency with the way -Pyrex commonly handles package imports. The main effect is that -classes now know about their fully qualified class name, including -the package name of their module.
  • -
  • Keyword-only arguments in some API functions, especially in the -parsers and serialisers.
  • -
  • Tag name validation in lxml.etree (and lxml.html) now distinguishes -between HTML tags and XML tags based on the parser that was used to -parse or create them. HTML tags no longer reject any non-ASCII -characters in tag names but only spaces and the special characters -<>&/"'.
  • -
  • lxml.etree now emits a warning if you use XPath with libxml2 2.6.27 -(which can crash on certain XPath errors)
  • -
  • Type annotation in objectify now preserves the already annotated type by -default to prevent losing type information that is already there.
  • -
  • element.getiterator() returns a list, use element.iter() to retrieve -an iterator (ElementTree 1.3 compatible behaviour)
  • -
  • objectify.PyType for None is now called "NoneType"
  • -
  • el.getiterator() renamed to el.iter(), following ElementTree 1.3 - -original name is still available as alias
  • -
  • In the public C-API, findOrBuildNodeNs() was replaced by the more -generic findOrBuildNodeNsPrefix
  • -
  • Major refactoring in XPath/XSLT extension function code
  • -
  • Network access in parsers disabled by default
  • -
-
-
-
-

1.3.6 (2007-10-29)

-
-

Bugs fixed

-
    -
  • Backported decref crash fix from 2.0
  • -
  • Well hidden free-while-in-use crash bug in ObjectPath
  • -
-
-
-

Other changes

-
    -
  • The test suites now run gc.collect() in the tearDown() -methods. While this makes them take a lot longer to run, it also -makes it easier to link a specific test to garbage collection -problems that would otherwise appear in later tests.
  • -
-
-
-
-

1.3.5 (2007-10-22)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • lxml.etree could crash when adding more than 10000 namespaces to a -document
  • -
  • lxml failed to serialise namespace declarations of elements other -than the root node of a tree
  • -
-
-
-
-

1.3.4 (2007-08-30)

-
-

Features added

-
    -
  • The ElementMaker in lxml.builder now accepts the keyword arguments -namespace and nsmap to set a namespace and nsmap for the Elements it -creates.
  • -
  • The docinfo on ElementTree objects has new properties internalDTD -and externalDTD that return a DTD object for the internal or external -subset of the document respectively.
  • -
  • Serialising an ElementTree now includes any internal DTD subsets that are -part of the document, as well as comments and PIs that are siblings of the -root node.
  • -
-
-
-

Bugs fixed

-
    -
  • Parsing with the no_network option could fail
  • -
-
-
-

Other changes

-
    -
  • lxml now raises a TagNameWarning about tag names containing ':' instead of -an Error as 1.3.3 did. The reason is that a number of projects currently -misuse the previous lack of tag name validation to generate namespace -prefixes without declaring namespaces. Apart from the danger of generating -broken XML this way, it also breaks most of the namespace-aware tools in -XML, including XPath, XSLT and validation. lxml 1.3.x will continue to -support this bug with a Warning, while lxml 2.0 will be strict about -well-formed tag names (not only regarding ':').
  • -
  • Serialising an Element no longer includes its comment and PI siblings (only -ElementTree serialisation includes them).
  • -
-
-
-
-

1.3.3 (2007-07-26)

-
-

Features added

-
    -
  • ElementTree compatible parser ETCompatXMLParser strips processing -instructions and comments while parsing XML
  • -
  • Parsers now support stripping PIs (keyword argument 'remove_pis')
  • -
  • etree.fromstring() now supports parsing both HTML and XML, depending on -the parser you pass.
  • -
  • Support base_url keyword argument in HTML() and XML()
  • -
-
-
-

Bugs fixed

-
    -
  • Parsing from Python Unicode strings failed on some platforms
  • -
  • Element() did not raise an exception on tag names containing ':'
  • -
  • Element.getiterator(tag) did not accept Comment and -ProcessingInstruction as tags. It also accepts Element now.
  • -
-
-
-
-

1.3.2 (2007-07-03)

-
-

Features added

-
-
-

Bugs fixed

-
    -
  • "deallocating None" crash bug
  • -
-
-
-
-

1.3.1 (2007-07-02)

-
-

Features added

-
    -
  • objectify.DataElement now supports setting values from existing data -elements (not just plain Python types) and reuses defined namespaces etc.
  • -
  • E-factory support for lxml.objectify (objectify.E)
  • -
-
-
-

Bugs fixed

-
    -
  • Better way to prevent crashes in Element proxy cleanup code
  • -
  • objectify.DataElement didn't set up None value correctly
  • -
  • objectify.DataElement didn't check the value against the provided type hints
  • -
  • Reference-counting bug in Element.attrib.pop()
  • -
-
-
-
-

1.3 (2007-06-24)

-
-

Features added

-
    -
  • Module lxml.pyclasslookup module implements an Element class lookup -scheme that can access the entire tree in read-only mode to help determining -a suitable Element class
  • -
  • Parsers take a remove_comments keyword argument that skips over comments
  • -
  • parse() function in objectify, corresponding to XML() etc.
  • -
  • Element.addnext(el) and Element.addprevious(el) methods to support -adding processing instructions and comments around the root node
  • -
  • Element.attrib was missing clear() and pop() methods
  • -
  • Extended type annotation in objectify: cleaner annotation namespace setup -plus new deannotate() function
  • -
  • Support for custom Element class instantiation in lxml.sax: passing a -makeelement function to the ElementTreeContentHandler will reuse the -lookup context of that function
  • -
  • '.' represents empty ObjectPath (identity)
  • -
  • Element.values() to accompany the existing .keys() and .items()
  • -
  • collectAttributes() C-function to build a list of attribute -keys/values/items for a libxml2 node
  • -
  • DTD validator class (like RelaxNG and XMLSchema)
  • -
  • HTML generator helpers by Fredrik Lundh in lxml.htmlbuilder
  • -
  • ElementMaker XML generator by Fredrik Lundh in lxml.builder.E
  • -
  • Support for pickling objectify.ObjectifiedElement objects to XML
  • -
  • update() method on Element.attrib
  • -
  • Optimised replacement for libxml2's _xmlReconsiliateNs(). This allows lxml -a better handling of namespaces when moving elements between documents.
  • -
-
-
-

Bugs fixed

-
    -
  • Removing Elements from a tree could make them lose their namespace -declarations
  • -
  • ElementInclude didn't honour base URL of original document
  • -
  • Replacing the children slice of an Element would cut off the tails of the -original children
  • -
  • Element.getiterator(tag) did not accept Comment and -ProcessingInstruction as tags
  • -
  • API functions now check incoming strings for XML conformity. Zero bytes or -low ASCII characters are no longer accepted (AssertionError).
  • -
  • XSLT parsing failed to pass resolver context on to imported documents
  • -
  • passing '' as namespace prefix in nsmap could be passed through to libxml2
  • -
  • Objectify couldn't handle prefixed XSD type names in xsi:type
  • -
  • More ET compatible behaviour when writing out XML declarations or not
  • -
  • More robust error handling in iterparse()
  • -
  • Documents lost their top-level PIs and comments on serialisation
  • -
  • lxml.sax failed on comments and PIs. Comments are now properly ignored and -PIs are copied.
  • -
  • Possible memory leaks in namespace handling when moving elements between -documents
  • -
-
-
-

Other changes

-
    -
  • major restructuring in the documentation
  • -
-
-
-
-

1.2.1 (2007-02-27)

-
-

Bugs fixed

-
    -
  • Build fixes for MS compiler
  • -
  • Item assignments to special names like element["text"] failed
  • -
  • Renamed ObjectifiedDataElement.__setText() to _setText() to make it easier -to access
  • -
  • The pattern for attribute names in ObjectPath was too restrictive
  • -
-
-
-
-

1.2 (2007-02-20)

-
-

Features added

-
    -
  • Rich comparison of QName objects
  • -
  • Support for regular expressions in benchmark selection
  • -
  • get/set emulation (not .attrib!) for attributes on processing instructions
  • -
  • ElementInclude Python module for ElementTree compatible XInclude processing -that honours custom resolvers registered with the source document
  • -
  • ElementTree.parser property holds the parser used to parse the document
  • -
  • setup.py has been refactored for greater readability and flexibility
  • -
  • --rpath flag to setup.py to induce automatic linking-in of dynamic library -runtime search paths has been renamed to --auto-rpath. This makes it -possible to pass an --rpath directly to distutils; previously this was being -shadowed.
  • -
-
-
-

Bugs fixed

-
    -
  • Element instantiation now uses locks to prevent race conditions with threads
  • -
  • ElementTree.write() did not raise an exception when the file was not writable
  • -
  • Error handling could crash under Python <= 2.4.1 - fixed by disabling thread -support in these environments
  • -
  • Element.find*() did not accept QName objects as path
  • -
-
-
-

Other changes

-
    -
  • code cleanup: redundant _NodeBase super class merged into _Element class -Note: although the impact should be zero in most cases, this change breaks -the compatibility of the public C-API
  • -
-
-
-
-

1.1.2 (2006-10-30)

-
-

Features added

-
    -
  • Data elements in objectify support repr(), which is now used by dump()
  • -
  • Source distribution now ships with a patched Pyrex
  • -
  • New C-API function makeElement() to create new elements with text, -tail, attributes and namespaces
  • -
  • Reuse original parser flags for XInclude
  • -
  • Simplified support for handling XSLT processing instructions
  • -
-
-
-

Bugs fixed

-
    -
  • Parser resources were not freed before the next parser run
  • -
  • Open files and XML strings returned by Python resolvers were not -closed/freed
  • -
  • Crash in the IDDict returned by XMLDTDID
  • -
  • Copying Comments and ProcessingInstructions failed
  • -
  • Memory leak for external URLs in _XSLTProcessingInstruction.parseXSL()
  • -
  • Memory leak when garbage collecting tailed root elements
  • -
  • HTML script/style content was not propagated to .text
  • -
  • Show text xincluded between text nodes correctly in .text and .tail
  • -
  • 'integer * objectify.StringElement' operation was not supported
  • -
-
-
-
-

1.1.1 (2006-09-21)

-
-

Features added

-
    -
  • XSLT profiling support (profile_run keyword)
  • -
  • countchildren() method on objectify.ObjectifiedElement
  • -
  • Support custom elements for tree nodes in lxml.objectify
  • -
-
-
-

Bugs fixed

-
    -
  • lxml.objectify failed to support long data values (e.g., "123L")
  • -
  • Error messages from XSLT did not reach XSLT.error_log
  • -
  • Factories objectify.Element() and objectify.DataElement() were missing -attrib and nsmap keyword arguments
  • -
  • Changing the default parser in lxml.objectify did not update the factories -Element() and DataElement()
  • -
  • Let lxml.objectify.Element() always generate tree elements (not data -elements)
  • -
  • Build under Windows failed ('0' bug in patched Pyrex version)
  • -
-
-
-
-

1.1 (2006-09-13)

-
-

Features added

-
    -
  • Comments and processing instructions return '<!-- comment -->' and -'<?pi-target content?>' for repr()
  • -
  • Parsers are now the preferred (and default) place where element class lookup -schemes should be registered. Namespace lookup is no longer supported by -default.
  • -
  • Support for Python 2.5 beta
  • -
  • Unlock the GIL for deep copying documents and for XPath()
  • -
  • New compact keyword argument for parsing read-only documents
  • -
  • Support for parser options in iterparse()
  • -
  • The namespace axis is supported in XPath and returns (prefix, URI) -tuples
  • -
  • The XPath expression "/" now returns an empty list instead of raising an -exception
  • -
  • XML-Object API on top of lxml (lxml.objectify)
  • -
  • Customizable Element class lookup:
      -
    • different pre-implemented lookup mechanisms
    • -
    • support for externally provided lookup functions
    • -
    -
  • -
  • Support for processing instructions (ET-like, not compatible)
  • -
  • Public C-level API for independent extension modules
  • -
  • Module level iterwalk() function as 'iterparse' for trees
  • -
  • Module level iterparse() function similar to ElementTree (see -documentation for differences)
  • -
  • Element.nsmap property returns a mapping of all namespace prefixes known at -the Element to their namespace URI
  • -
  • Reentrant threading support in RelaxNG, XMLSchema and XSLT
  • -
  • Threading support in parsers and serializers:
      -
    • All in-memory operations (tostring, parse(StringIO), etc.) free the GIL
    • -
    • File operations (on file names) free the GIL
    • -
    • Reading from file-like objects frees the GIL and reacquires it for reading
    • -
    • Serialisation to file-like objects is single-threaded (high lock overhead)
    • -
    -
  • -
  • Element iteration over XPath axes:
      -
    • Element.iterdescendants() iterates over the descendants of an element
    • -
    • Element.iterancestors() iterates over the ancestors of an element (from -parent to parent)
    • -
    • Element.itersiblings() iterates over either the following or preceding -siblings of an element
    • -
    • Element.iterchildren() iterates over the children of an element in either -direction
    • -
    • All iterators support the tag keyword argument to restrict the -generated elements
    • -
    -
  • -
  • Element.getnext() and Element.getprevious() return the direct siblings of an -element
  • -
-
-
-

Bugs fixed

-
    -
  • filenames with local 8-bit encoding were not supported
  • -
  • 1.1beta did not compile under Python 2.3
  • -
  • ignore unknown 'pyval' attribute values in objectify
  • -
  • objectify.ObjectifiedElement.addattr() failed to accept Elements and Lists
  • -
  • objectify.ObjectPath.setattr() failed to accept Elements and Lists
  • -
  • XPathSyntaxError now inherits from XPathError
  • -
  • Threading race conditions in RelaxNG and XMLSchema
  • -
  • Crash when mixing elements from XSLT results into other trees, concurrent -XSLT is only allowed when the stylesheet was parsed in the main thread
  • -
  • The EXSLT regexp:match function now works as defined (except for some -differences in the regular expression syntax)
  • -
  • Setting element.text to '' returned None on request, not the empty string
  • -
  • iterparse() could crash on long XML files
  • -
  • Creating documents no longer copies the parser for later URL resolving. For -performance reasons, only a reference is kept. Resolver updates on the -parser will now be reflected by documents that were parsed before the -change. Although this should rarely become visible, it is a behavioral -change from 1.0.
  • -
-
-
-
-

1.0.4 (2006-09-09)

-
-

Features added

-
    -
  • List-like Element.extend() method
  • -
-
-
-

Bugs fixed

-
    -
  • Crash in tail handling in Element.replace()
  • -
-
-
-
-

1.0.3 (2006-08-08)

-
-

Features added

-
    -
  • Element.replace(old, new) method to replace a subelement by another one
  • -
-
-
-

Bugs fixed

-
    -
  • Crash when mixing elements from XSLT results into other trees
  • -
  • Copying/deepcopying did not work for ElementTree objects
  • -
  • Setting an attribute to a non-string value did not raise an exception
  • -
  • Element.remove() deleted the tail text from the removed Element
  • -
-
-
-
-

1.0.2 (2006-06-27)

-
-

Features added

-
    -
  • Support for setting a custom default Element class as opposed to namespace -specific classes (which still override the default class)
  • -
-
-
-

Bugs fixed

-
    -
  • Rare exceptions in Python list functions were not handled
  • -
  • Parsing accepted unicode strings with XML encoding declaration in certain -cases
  • -
  • Parsing 8-bit encoded strings from StringIO objects raised an exception
  • -
  • Module function initThread() was removed - useless (and never worked)
  • -
  • XSLT and parser exception messages include the error line number
  • -
-
-
-
-

1.0.1 (2006-06-09)

-
-

Features added

-
    -
  • Repeated calls to Element.attrib now efficiently return the same instance
  • -
-
-
-

Bugs fixed

-
    -
  • Document deallocation could crash in certain garbage collection scenarios
  • -
  • Extension function calls in XSLT variable declarations could break the -stylesheet and crash on repeated calls
  • -
  • Deep copying Elements could lose namespaces declared in parents
  • -
  • Deep copying Elements did not copy tail
  • -
  • Parsing file(-like) objects failed to load external entities
  • -
  • Parsing 8-bit strings from file(-like) objects raised an exception
  • -
  • xsl:include failed when the stylesheet was parsed from a file-like object
  • -
  • lxml.sax.ElementTreeProducer did not call startDocument() / endDocument()
  • -
  • MSVC compiler complained about long strings (supports only 2048 bytes)
  • -
-
-
-
-

1.0 (2006-06-01)

-
-

Features added

-
    -
  • Element.getiterator() and the findall() methods support finding arbitrary -elements from a namespace (pattern {namespace}*)
  • -
  • Another speedup in tree iteration code
  • -
  • General speedup of Python Element object creation and deallocation
  • -
  • Writing C14N no longer serializes in memory (reduced memory footprint)
  • -
  • PyErrorLog for error logging through the Python logging module
  • -
  • Element.getroottree() returns an ElementTree for the root node of the -document that contains the element.
  • -
  • ElementTree.getpath(element) returns a simple, absolute XPath expression to -find the element in the tree structure
  • -
  • Error logs have a last_error attribute for convenience
  • -
  • Comment texts can be changed through the API
  • -
  • Formatted output via pretty_print keyword in serialization functions
  • -
  • XSLT can block access to file system and network via XSLTAccessControl
  • -
  • ElementTree.write() no longer serializes in memory (reduced memory -footprint)
  • -
  • Speedup of Element.findall(tag) and Element.getiterator(tag)
  • -
  • Support for writing the XML representation of Elements and ElementTrees to -Python unicode strings via etree.tounicode()
  • -
  • Support for writing XSLT results to Python unicode strings via unicode()
  • -
  • Parsing a unicode string no longer copies the string (reduced memory -footprint)
  • -
  • Parsing file-like objects reads chunks rather than the whole file (reduced -memory footprint)
  • -
  • Parsing StringIO objects from the start avoids copying the string (reduced -memory footprint)
  • -
  • Read-only 'docinfo' attribute in ElementTree class holds DOCTYPE -information, original encoding and XML version as seen by the parser
  • -
  • etree module can be compiled without libxslt by commenting out the line -include "xslt.pxi" near the end of the etree.pyx source file
  • -
  • Better error messages in parser exceptions
  • -
  • Error reporting also works in XSLT
  • -
  • Support for custom document loaders (URI resolvers) in parsers and XSLT, -resolvers are registered at parser level
  • -
  • Implementation of exslt:regexp for XSLT based on the Python 're' module, -enabled by default, can be switched off with 'regexp=False' keyword argument
  • -
  • Support for exslt extensions (libexslt) and libxslt extra functions -(node-set, document, write, output)
  • -
  • Substantial speedup in XPath.evaluate()
  • -
  • HTMLParser for parsing (broken) HTML
  • -
  • XMLDTDID function parses XML into tuple (root node, ID dict) based on xml:id -implementation of libxml2 (as opposed to ET compatible XMLID)
  • -
-
-
-

Bugs fixed

-
    -
  • Memory leak in Element.__setitem__
  • -
  • Memory leak in Element.attrib.items() and Element.attrib.values()
  • -
  • Memory leak in XPath extension functions
  • -
  • Memory leak in unicode related setup code
  • -
  • Element now raises ValueError on empty tag names
  • -
  • Namespace fixing after moving elements between documents could fail if the -source document was freed too early
  • -
  • Setting namespace-less tag names on namespaced elements ('{ns}t' -> 't') -didn't reset the namespace
  • -
  • Unknown constants from newer libxml2 versions could raise exceptions in the -error handlers
  • -
  • lxml.etree compiles much faster
  • -
  • On libxml2 <= 2.6.22, parsing strings with encoding declaration could fail -in certain cases
  • -
  • Document reference in ElementTree objects was not updated when the root -element was moved to a different document
  • -
  • Running absolute XPath expressions on an Element now evaluates against the -root tree
  • -
  • Evaluating absolute XPath expressions (/*) on an ElementTree could fail
  • -
  • Crashes when calling XSLT, RelaxNG, etc. with uninitialized ElementTree -objects
  • -
  • Removed public function initThreadLogging(), replaced by more general -initThread() which fixes a number of setup problems in threads
  • -
  • Memory leak when using iconv encoders in tostring/write
  • -
  • Deep copying Elements and ElementTrees maintains the document information
  • -
  • Serialization functions raise LookupError for unknown encodings
  • -
  • Memory deallocation crash resulting from deep copying elements
  • -
  • Some ElementTree methods could crash if the root node was not initialized -(neither file nor element passed to the constructor)
  • -
  • Element/SubElement failed to set attribute namespaces from passed attrib -dictionary
  • -
  • tostring() adds an XML declaration for non-ASCII encodings
  • -
  • tostring() failed to serialize encodings that contain 0-bytes
  • -
  • ElementTree.xpath() and XPathDocumentEvaluator were not using the -ElementTree root node as reference point
  • -
  • Calling document('') in XSLT failed to return the stylesheet
  • -
-
-
-
-

0.9.2 (2006-05-10)

-
-

Features added

-
    -
  • Speedup for Element.makeelement(): the new element reuses the original -libxml2 document instead of creating a new empty one
  • -
  • Speedup for reversed() iteration over element children (Py2.4+ only)
  • -
  • ElementTree compatible QName class
  • -
  • RelaxNG and XMLSchema accept any Element, not only ElementTrees
  • -
-
-
-

Bugs fixed

-
    -
  • str(xslt_result) was broken for XSLT output other than UTF-8
  • -
  • Memory leak if write_c14n fails to write the file after conversion
  • -
  • Crash in XMLSchema and RelaxNG when passing non-schema documents
  • -
  • Memory leak in RelaxNG() when RelaxNGParseError is raised
  • -
-
-
-
-

0.9.1 (2006-03-30)

-
-

Features added

-
    -
  • lxml.sax.ElementTreeContentHandler checks closing elements and raises -SaxError on mismatch
  • -
  • lxml.sax.ElementTreeContentHandler supports namespace-less SAX events -(startElement, endElement) and defaults to empty attributes (keyword -argument)
  • -
  • Speedup for repeatedly accessing element tag names
  • -
  • Minor API performance improvements
  • -
-
-
-

Bugs fixed

-
    -
  • Memory deallocation bug when using XSLT output method "html"
  • -
  • sax.py was handling UTF-8 encoded tag names where it shouldn't
  • -
  • lxml.tests package will no longer be installed (is still in source tar)
  • -
-
-
-
-

0.9 (2006-03-20)

-
-

Features added

-
    -
  • Error logging API for libxml2 error messages
  • -
  • Various performance improvements
  • -
  • Benchmark script for lxml, ElementTree and cElementTree
  • -
  • Support for registering extension functions through new FunctionNamespace -class (see doc/extensions.txt)
  • -
  • ETXPath class for XPath expressions in ElementTree notation ('//{ns}tag')
  • -
  • Support for variables in XPath expressions (also in XPath class)
  • -
  • XPath class for compiled XPath expressions
  • -
  • XMLID module level function (ElementTree compatible)
  • -
  • XMLParser API for customized libxml2 parser configuration
  • -
  • Support for custom Element classes through new Namespace API (see -doc/namespace_extensions.txt)
  • -
  • Common exception base class LxmlError for module exceptions
  • -
  • real iterator support in iter(Element), Element.getiterator()
  • -
  • XSLT objects are callable, result trees support str()
  • -
  • Added MANIFEST.in for easier creation of RPM files.
  • -
  • 'getparent' method on elements allows navigation to an element's -parent element.
  • -
  • Python core compatible SAX tree builder and SAX event generator. See -doc/sax.txt for more information.
  • -
-
-
-

Bugs fixed

-
    -
  • Segfaults and memory leaks in various API functions of Element
  • -
  • Segfault in XSLT.tostring()
  • -
  • ElementTree objects no longer interfere, Elements can be root of different -ElementTrees at the same time
  • -
  • document('') works in XSLT documents read from files (in-memory documents -cannot support this due to libxslt deficiencies)
  • -
-
-
-
-

0.8 (2005-11-03)

-
-

Features added

-
    -
  • Support for copy.deepcopy() on elements. copy.copy() works also, but -does the same thing, and does not create a shallow copy, as that -makes no sense in the context of libxml2 trees. This means a -potential incompatibility with ElementTree, but there's more chance -that it works than if copy.copy() isn't supported at all.
  • -
  • Increased compatibility with (c)ElementTree; .parse() on ElementTree is -supported and parsing of gzipped XML files works.
  • -
  • implemented index() on elements, allowing one to find the index of a -SubElement.
  • -
-
-
-

Bugs fixed

-
    -
  • Use xslt-config instead of xml2-config to find out libxml2 -directories to take into account a case where libxslt is installed -in a different directory than libxslt.
  • -
  • Eliminate crash condition in iteration when text nodes are changed.
  • -
  • Passing 'None' to tostring() does not result in a segfault anymore, -but an AssertionError.
  • -
  • Some test fixes for Windows.
  • -
  • Raise XMLSyntaxError and XPathSyntaxError instead of plain python -syntax errors. This should be less confusing.
  • -
  • Fixed error with uncaught exception in Pyrex code.
  • -
  • Calling lxml.etree.fromstring('') throws XMLSyntaxError instead of a -segfault.
  • -
  • has_key() works on attrib. 'in' tests also work correctly on attrib.
  • -
  • INSTALL.txt was saying 2.2.16 instead of 2.6.16 as a supported -libxml2 version, as it should.
  • -
  • Passing a UTF-8 encoded string to the XML() function would fail; -fixed.
  • -
-
-
-
-

0.7 (2005-06-15)

-
-

Features added

-
    -
  • parameters (XPath expressions) can be passed to XSLT using keyword -parameters.
  • -
  • Simple XInclude support. Calling the xinclude() method on a tree -will process any XInclude statements in the document.
  • -
  • XMLSchema support. Use the XMLSchema class or the convenience -xmlschema() method on a tree to do XML Schema (XSD) validation.
  • -
  • Added convenience xslt() method on tree. This is less efficient -than the XSLT object, but makes it easier to write quick code.
  • -
  • Added convenience relaxng() method on tree. This is less efficient -than the RelaxNG object, but makes it easier to write quick code.
  • -
  • Make it possible to use XPathEvaluator with elements as well. The -XPathEvaluator in this case will retain the element so multiple -XPath queries can be made against one element efficiently. This -replaces the second argument to the .evaluate() method that existed -previously.
  • -
  • Allow registerNamespace() to be called on an XPathEvaluator, after -creation, to add additional namespaces. Also allow registerNamespaces(), -which does the same for a namespace dictionary.
  • -
  • Add 'prefix' attribute to element to be able to read prefix information. -This is entirely read-only.
  • -
  • It is possible to supply an extra nsmap keyword parameter to -the Element() and SubElement() constructors, which supplies a -prefix to namespace URI mapping. This will create namespace -prefix declarations on these elements and these prefixes will show up -in XML serialization.
  • -
-
-
-

Bugs fixed

-
    -
  • Killed yet another memory management related bug: trees created -using newDoc would not get a libxml2-level dictionary, which caused -problems when deallocating these documents later if they contained a -node that came from a document with a dictionary.
  • -
  • Moving namespaced elements between documents was problematic as -references to the original document would remain. This has been fixed -by applying xmlReconciliateNs() after each move operation.
  • -
  • Can pass None to 'dump()' without segfaults.
  • -
  • tostring() works properly for non-root elements as well.
  • -
  • Cleaned out the tostring() method so it should handle encoding -correctly.
  • -
  • Cleaned out the ElementTree.write() method so it should handle encoding -correctly. Writing directly to a file should also be faster, as there is no -need to go through a Python string in that case. Made sure the test cases -test both serializing to StringIO as well as serializing to a real file.
  • -
-
-
-
-

0.6 (2005-05-14)

-
-

Features added

-
    -
  • Changed setup.py so that library_dirs is also guessed. This should -help with compilation on the Mac OS X platform, where otherwise the -wrong library (shipping with the OS) could be picked up.
  • -
  • Tweaked setup.py so that it picks up the version from version.txt.
  • -
-
-
-

Bugs fixed

-
    -
  • Do the right thing when handling namespaced attributes.
  • -
  • fix bug where tostring() moved nodes into new documents. tostring() -had very nasty side-effects before this fix, sorry!
  • -
-
-
-
-

0.5.1 (2005-04-09)

-
    -
  • Python 2.2 compatibility fixes.
  • -
  • unicode fixes in Element() and Comment() as well as XML(); unicode -input wasn't properly being UTF-8 encoded.
  • -
-
-
-

0.5 (2005-04-08)

-

Initial public release.

-
-
- - - diff --git a/doc/html/changes-4.3.3.html b/doc/html/changes-4.3.3.html new file mode 100644 index 00000000..1e93f762 --- /dev/null +++ b/doc/html/changes-4.3.3.html @@ -0,0 +1,3484 @@ + + + + + + +lxml changelog + + + +
+

lxml changelog

+ +
+

4.3.3 (2019-03-26)

+
+

Bugs fixed

+
    +
  • Fix leak of output buffer and unclosed files in _XSLTResultTree.write_output().
  • +
+
+
+
+

4.3.2 (2019-02-29)

+
+

Bugs fixed

+
    +
  • Crash in 4.3.1 when appending a child subtree with certain text nodes.
  • +
+
+
+

Other changes

+
    +
  • Built with Cython 0.29.6.
  • +
+
+
+
+

4.3.1 (2019-02-08)

+
+

Bugs fixed

+
    +
  • LP#1814522: Crash when appending a child subtree that contains unsubstituted +entity references.
  • +
+
+
+

Other changes

+
    +
  • Built with Cython 0.29.5.
  • +
+
+
+
+

4.3.0 (2019-01-04)

+
+

Features added

+
    +
  • The module lxml.sax is compiled using Cython in order to speed it up.
  • +
  • GH#267: lxml.sax.ElementTreeProducer now preserves the namespace prefixes. +If two prefixes point to the same URI, the first prefix in alphabetical order +is used. Patch by Lennart Regebro.
  • +
  • Updated ISO-Schematron implementation to 2013 version (now MIT licensed) +and the corresponding schema to the 2016 version (with optional "properties").
  • +
+
+
+

Other changes

+
    +
  • GH#270, GH#271: Support for Python 2.6 and 3.3 was removed. +Patch by hugovk.
  • +
  • The minimum dependency versions were raised to libxml2 2.9.2 and libxslt 1.1.27, +which were released in 2014 and 2012 respectively.
  • +
  • Built with Cython 0.29.2.
  • +
+
+
+
+

4.2.6 (2019-01-02)

+
+

Bugs fixed

+
    +
  • LP#1799755: Fix a DeprecationWarning in Py3.7+.
  • +
  • Import warnings in Python 3.6+ were resolved.
  • +
+
+
+
+

4.2.5 (2018-09-09)

+
+

Bugs fixed

+
    +
  • Javascript URLs that used URL escaping were not removed by the HTML cleaner. +Security problem found by Omar Eissa. (CVE-2018-19787)
  • +
+
+
+
+

4.2.4 (2018-08-03)

+
+

Features added

+
    +
  • GH#259: Allow using pkg-config for build configuration. +Patch by Patrick Griffis.
  • +
+
+
+

Bugs fixed

+
    +
  • LP#1773749, GH#268: Crash when moving an element to another document with +Element.insert(). +Patch by Alexander Weggerle.
  • +
+
+
+
+

4.2.3 (2018-06-27)

+
+

Bugs fixed

+
    +
  • Reverted GH#265: lxml links against zlib as a shared library again.
  • +
+
+
+
+

4.2.2 (2018-06-22)

+
+

Bugs fixed

+
    +
  • GH#266: Fix sporadic crash during GC when parse-time schema validation is used +and the parser participates in a reference cycle. +Original patch by Julien Greard.
  • +
  • GH#265: lxml no longer links against zlib as a shared library, only on static builds. +Patch by Nehal J Wani.
  • +
+
+
+
+

4.2.1 (2018-03-21)

+
+

Bugs fixed

+
    +
  • LP#1755825: iterwalk() failed to return the 'start' event for the initial +element if a tag selector is used.
  • +
  • LP#1756314: Failure to import 4.2.0 into PyPy due to a missing library symbol.
  • +
  • LP#1727864, GH#258: Add "-isysroot" linker option on MacOS as needed by XCode 9.
  • +
+
+
+
+

4.2.0 (2018-03-13)

+
+

Features added

+
    +
  • GH#255: SelectElement.value returns more standard-compliant and +browser-like defaults for non-multi-selects. If no option is selected, the +value of the first option is returned (instead of None). If multiple options +are selected, the value of the last one is returned (instead of that of the +first one). If no options are present (not standard-compliant) +SelectElement.value still returns None.
  • +
  • GH#261: The HTMLParser() now supports the huge_tree option. +Patch by stranac.
  • +
+
+
+

Bugs fixed

+
    +
  • LP#1551797: Some XSLT messages were not captured by the transform error log.
  • +
  • LP#1737825: Crash at shutdown after an interrupted iterparse run with XMLSchema +validation.
  • +
+
+
+

Other changes

+
+
+
+

4.1.1 (2017-11-04)

+
    +
  • Rebuild with Cython 0.27.3 to improve support for Py3.7.
  • +
+
+
+

4.1.0 (2017-10-13)

+
+

Features added

+
    +
  • ElementPath supports text predicates for current node, like "[.='text']".
  • +
  • ElementPath allows spaces in predicates.
  • +
  • Custom Element classes and XPath functions can now be registered with a +decorator rather than explicit dict assignments.
  • +
  • Static Linux wheels are now built with link time optimisation (LTO) enabled. +This should have a beneficial impact on the overall performance by providing +a tighter compiler integration between lxml and libxml2/libxslt.
  • +
+
+
+

Bugs fixed

+
    +
  • LP#1722776: Requesting non-Element objects like comments from a document with +PythonElementClassLookup could fail with a TypeError.
  • +
+
+
+
+

4.0.0 (2017-09-17)

+
+

Features added

+
    +
  • The ElementPath implementation is now compiled using Cython, +which speeds up the .find*() methods quite significantly.
  • +
  • The modules lxml.builder, lxml.html.diff and lxml.html.clean +are also compiled using Cython in order to speed them up.
  • +
  • xmlfile() supports async coroutines using async with and await.
  • +
  • iterwalk() has a new method skip_subtree() that prevents walking into +the descendants of the current element.
  • +
  • RelaxNG.from_rnc_string() accepts a base_url argument to +allow relative resource lookups.
  • +
  • The XSLT result object has a new method .write_output(file) that serialises +output data into a file according to the <xsl:output> configuration.
  • +
+
+
+

Bugs fixed

+
    +
  • GH#251: HTML comments were handled incorrectly by the soupparser. +Patch by mozbugbox.

    +
  • +
  • LP#1654544: The html5parser no longer passes the useChardet option +if the input is a Unicode string, unless explicitly requested. When parsing +files, the default is to enable it when a URL or file path is passed (because +the file is then opened in binary mode), and to disable it when reading from +a file(-like) object.

    +

    Note: This is a backwards incompatible change of the default configuration. +If your code parses byte strings/streams and depends on character detection, +please pass the option guess_charset=True explicitly, which already worked +in older lxml versions.

    +
  • +
  • LP#1703810: etree.fromstring() failed to parse UTF-32 data with BOM.

    +
  • +
  • LP#1526522: Some RelaxNG errors were not reported in the error log.

    +
  • +
  • LP#1567526: Empty and plain text input raised a TypeError in soupparser.

    +
  • +
  • LP#1710429: Uninitialised variable usage in HTML diff.

    +
  • +
  • LP#1415643: The closing tags context manager in xmlfile() could continue +to output end tags even after writing failed with an exception.

    +
  • +
  • LP#1465357: xmlfile.write() now accepts and ignores None as input argument.

    +
  • +
  • Compilation under Py3.7-pre failed due to a modified function signature.

    +
  • +
+
+
+

Other changes

+
    +
  • The main module source files were renamed from lxml.*.pyx to plain +*.pyx (e.g. etree.pyx) to simplify their handling in the build +process. Care was taken to keep the old header files as fallbacks for +code that compiles against the public C-API of lxml, but it might still +be worth validating that third-party code does not notice this change.
  • +
+
+
+
+

3.8.0 (2017-06-03)

+
+

Features added

+
    +
  • ElementTree.write() has a new option doctype that writes out a +doctype string before the serialisation, in the same way as tostring().
  • +
  • GH#220: xmlfile allows switching output methods at an element level. +Patch by Burak Arslan.
  • +
  • LP#1595781, GH#240: added a PyCapsule Python API and C-level API for +passing externally generated libxml2 documents into lxml.
  • +
  • GH#244: error log entries have a new property path with an XPath +expression (if known, None otherwise) that points to the tree element +responsible for the error. Patch by Bob Kline.
  • +
  • The namespace prefix mapping that can be used in ElementPath now injects +a default namespace when passing a None prefix.
  • +
+
+
+

Bugs fixed

+
    +
  • GH#238: Character escapes were not hex-encoded in the xmlfile serialiser. +Patch by matejcik.
  • +
  • GH#229: fix for externally created XML documents. Patch by Theodore Dubois.
  • +
  • LP#1665241, GH#228: Form data handling in lxml.html no longer strips the +option values specified in form attributes but only the text values. +Patch by Ashish Kulkarni.
  • +
  • LP#1551797: revert previous fix for XSLT error logging as it breaks +multi-threaded XSLT processing.
  • +
  • LP#1673355, GH#233: fromstring() html5parser failed to parse byte strings.
  • +
+
+
+

Other changes

+
    +
  • The previously undocumented docstring option in ElementTree.write() +produces a deprecation warning and will eventually be removed.
  • +
+
+
+
+

3.7.4 (2017-??-??)

+
+

Bugs fixed

+
    +
  • LP#1551797: revert previous fix for XSLT error logging as it breaks +multi-threaded XSLT processing.
  • +
  • LP#1673355, GH#233: fromstring() html5parser failed to parse byte strings.
  • +
+
+
+
+

3.7.3 (2017-02-18)

+
+

Bugs fixed

+
    +
  • GH#218 was ineffective in Python 3.
  • +
  • GH#222: lxml.html.submit_form() failed in Python 3. +Patch by Jakub Wilk.
  • +
+
+
+
+

3.7.2 (2017-01-08)

+
    +
  • GH#220: xmlfile allows switching output methods at an element level. +Patch by Burak Arslan.
  • +
+
+

Bugs fixed

+
    +
  • Work around installation problems in recent Python 2.7 versions +due to FTP download failures.
  • +
  • GH#219: xmlfile.element() was not properly quoting attribute values. +Patch by Burak Arslan.
  • +
  • GH#218: xmlfile.element() was not properly escaping text content of +script/style tags. Patch by Burak Arslan.
  • +
+
+
+
+

3.7.1 (2016-12-23)

+
    +
  • No source changes, issued only to solve problems with the +binary packages released for 3.7.0.
  • +
+
+
+

3.7.0 (2016-12-10)

+
+

Features added

+
    +
  • GH#217: XMLSyntaxError now behaves more like its SyntaxError +baseclass. Patch by Philipp A.
  • +
  • GH#216: HTMLParser() now supports the same collect_ids parameter +as XMLParser(). Patch by Burak Arslan.
  • +
  • GH#210: Allow specifying a serialisation method in xmlfile.write(). +Patch by Burak Arslan.
  • +
  • GH#203: New option default_doctype in HTMLParser that allows +disabling the automatic doctype creation. Patch by Shadab Zafar.
  • +
  • GH#201: Calling the method .set('attrname') without value argument +(or None) on HTML elements creates an attribute without value that +serialises like <div attrname></div>. Patch by Daniel Holth.
  • +
  • GH#197: Ignore form input fields in form_values() when they are +marked as disabled in HTML. Patch by Kristian Klemon.
  • +
+
+
+

Bugs fixed

+
    +
  • GH#206: File name and line number were missing from XSLT error messages. +Patch by Marcus Brinkmann.
  • +
+
+
+

Other changes

+
    +
  • Log entries no longer allow anything but plain string objects as message text +and file name.
  • +
  • zlib is included in the list of statically built libraries.
  • +
+
+
+
+

3.6.4 (2016-08-20)

+ +
+
+

3.6.3 (2016-08-18)

+
    +
  • LP#1614603: change linker flags to build multi-linux wheels
  • +
+
+
+

3.6.2 (2016-08-18)

+
    +
  • LP#1614603: release without source changes to provide cleanly built Linux wheels
  • +
+
+
+

3.6.1 (2016-07-24)

+
+

Features added

+
    +
  • GH#180: Separate option inline_style for Cleaner that only removes style +attributes instead of all styles. Patch by Christian Pedersen.
  • +
  • GH#196: Windows build support for Python 3.5. Contribution by Maximilian Hils.
  • +
+
+
+

Bugs fixed

+
    +
  • GH#199: Exclude file fields from FormElement.form_values (as browsers do). +Patch by Tomas Divis.
  • +
  • GH#198, LP#1568167: Try to provide base URL from Resolver.resolve_string(). +Patch by Michael van Tellingen.
  • +
  • GH#191: More accurate float serialisation in objectify.FloatElement. +Patch by Holger Joukl.
  • +
  • LP#1551797: Repair XSLT error logging. Patch by Marcus Brinkmann.
  • +
+
+
+
+

3.6.0 (2016-03-17)

+
+

Features added

+
    +
  • GH#187: Now supports (only) version 5.x and later of PyPy. +Patch by Armin Rigo.
  • +
  • GH#181: Direct support for .rnc files in RelaxNG() if rnc2rng +is installed. Patch by Dirkjan Ochtman.
  • +
+
+
+

Bugs fixed

+
    +
  • GH#189: Static builds honour FTP proxy configurations when downloading +the external libs. Patch by Youhei Sakurai.
  • +
  • GH#186: Soupparser failed to process entities in Python 3.x. +Patch by Duncan Morris.
  • +
  • GH#185: Rare encoding related TypeError on import was fixed. +Patch by Petr Demin.
  • +
+
+
+
+

3.5.0 (2015-11-13)

+
+

Bugs fixed

+
    +
  • Unicode string results failed XPath queries in PyPy.
  • +
  • LP#1497051: HTML target parser failed to terminate on exceptions +and continued parsing instead.
  • +
  • Deprecated API usage in doctestcompare.
  • +
+
+
+
+

3.5.0b1 (2015-09-18)

+
+

Features added

+
    +
  • cleanup_namespaces() accepts a new argument keep_ns_prefixes +that does not remove definitions of the provided prefix-namespace +mapping from the tree.
  • +
  • cleanup_namespaces() accepts a new argument top_nsmap that +moves definitions of the provided prefix-namespace mapping to the +top of the tree.
  • +
  • LP#1490451: Element objects gained a cssselect() method as +known from lxml.html. Patch by Simon Sapin.
  • +
  • API functions and methods behave and look more like Python functions, +which allows introspection on them etc. One side effect to be aware of +is that the functions now bind as methods when assigned to a class +variable. A quick fix is to wrap them in staticmethod() (as for +normal Python functions).
  • +
  • ISO-Schematron support gained an option error_finder that allows +passing a filter function for picking validation errors from reports.
  • +
  • LP#1243600: Elements in lxml.html gained a classes property +that provides a set-like interface to the class attribute. +Original patch by masklinn.
  • +
  • LP#1341964: The soupparser now handles DOCTYPE declarations, comments +and processing instructions outside of the root element. +Patch by Olli Pottonen.
  • +
  • LP#1421512: The docinfo of a tree was made editable to allow +setting and removing the public ID and system ID of the DOCTYPE. +Patch by Olli Pottonen.
  • +
  • LP#1442427: More work-arounds for quirks and bugs in pypy and pypy3.
  • +
  • lxml.html.soupparser now uses BeautifulSoup version 4 instead +of version 3 if available.
  • +
+
+
+

Bugs fixed

+
    +
  • Memory errors that occur during tree adaptations (e.g. moving subtrees +to foreign documents) could leave the tree in a crash prone state.
  • +
  • Calling process_children() in an XSLT extension element without +an output_parent argument failed with a TypeError. +Fix by Jens Tröger.
  • +
  • GH#162: Image data in HTML data URLs is considered safe and +no longer removed by lxml.html.clean JavaScript cleaner.
  • +
  • GH#166: Static build could link libraries in wrong order.
  • +
  • GH#172: Rely a bit more on libxml2 for encoding detection rather than +rolling our own in some cases. Patch by Olli Pottonen.
  • +
  • GH#159: Validity checks for names and string content were tightened +to detect the use of illegal characters early. Patch by Olli Pottonen.
  • +
  • LP#1421921: Comments/PIs before the DOCTYPE declaration were not +serialised. Patch by Olli Pottonen.
  • +
  • LP#659367: Some HTML DOCTYPE declarations were not serialised. +Patch by Olli Pottonen.
  • +
  • LP#1238503: lxml.doctestcompare is now consistent with stdlib's doctest +in how it uses + and - to refer to unexpected and missing output.
  • +
  • Empty prefixes are explicitly rejected when a namespace mapping is used +with ElementPath to avoid hiding bugs in user code.
  • +
  • Several problems with PyPy were fixed by switching to Cython 0.23.
  • +
+
+
+
+

3.4.4 (2015-04-25)

+
+

Bugs fixed

+
    +
  • An ElementTree compatibility test added in lxml 3.4.3 that failed in +Python 3.4+ was removed again.
  • +
+
+
+
+

3.4.3 (2015-04-15)

+
+

Bugs fixed

+
    +
  • Expression cache in ElementPath was ignored. Fix by Changaco.
  • +
  • LP#1426868: Passing a default namespace and a prefixed namespace mapping +as nsmap into xmlfile.element() raised a TypeError.
  • +
  • LP#1421927: DOCTYPE system URLs were incorrectly quoted when containing +double quotes. Patch by Olli Pottonen.
  • +
  • LP#1419354: meta-redirect URLs were incorrectly processed by +iterlinks() if preceded by whitespace.
  • +
+
+
+
+

3.4.2 (2015-02-07)

+
+

Bugs fixed

+
    +
  • LP#1415907: Crash when creating an XMLSchema from a non-root element +of an XML document.
  • +
  • LP#1369362: HTML cleaning failed when hitting processing instructions +with pseudo-attributes.
  • +
  • CDATA() wrapped content was rejected for tail text.
  • +
  • CDATA sections were not serialised as tail text of the top-level element.
  • +
+
+
+
+

3.4.1 (2014-11-20)

+
+

Features added

+
    +
  • New htmlfile HTML generator to accompany the incremental xmlfile +serialisation API. Patch by Burak Arslan.
  • +
+
+
+

Bugs fixed

+
    +
  • lxml.sax.ElementTreeContentHandler did not initialise its superclass.
  • +
+
+
+
+

3.4.0 (2014-09-10)

+
+

Features added

+
    +
  • xmlfile(buffered=False) disables output buffering and flushes the +content after each API operation (starting/ending element blocks or writes). +A new method xf.flush() can alternatively be used to explicitly flush +the output.
  • +
  • lxml.html.document_fromstring has a new option ensure_head_body=True +which will add an empty head and/or body element to the result document if +missing.
  • +
  • lxml.html.iterlinks now returns links inside meta refresh tags.
  • +
  • New XMLParser option collect_ids=False to disable ID hash table +creation. This can substantially speed up parsing of documents with many +different IDs that are not used.
  • +
  • The parser uses per-document hash tables for XML IDs. This reduces the +load of the global parser dict and speeds up parsing for documents with +many different IDs.
  • +
  • ElementTree.getelementpath(element) returns a structural ElementPath +expression for the given element, which can be used for lookups later.
  • +
  • xmlfile() accepts a new argument close=True to close file(-like) +objects after writing to them. Before, xmlfile() only closed the file +if it had opened it internally.
  • +
  • Allow "bytearray" type for ASCII text input.
  • +
+
+
+

Bugs fixed

+
+
+

Other changes

+
    +
  • LP#400588: decoding errors have become hard errors even in recovery mode. +Previously, they could lead to an internal tree representation in a mixed +encoding state, which lead to very late errors or even silently incorrect +behaviour during tree traversal or serialisation.
  • +
  • Requires Python 2.6, 2.7, 3.2 or later. No longer supports +Python 2.4, 2.5 and 3.1, use lxml 3.3.x for those.
  • +
  • Requires libxml2 2.7.0 or later and libxslt 1.1.23 or later, +use lxml 3.3.x with older versions.
  • +
+
+
+
+

3.3.6 (2014-08-28)

+
+

Bugs fixed

+
    +
  • Prevent tree cycle creation when adding Elements as siblings.
  • +
  • LP#1361948: crash when deallocating Element siblings without parent.
  • +
  • LP#1354652: crash when traversing internally loaded documents in XSLT +extension functions.
  • +
+
+
+
+

3.3.5 (2014-04-18)

+
+

Bugs fixed

+
    +
  • HTML cleaning could fail to strip javascript links that mix control +characters into the link scheme.
  • +
+
+
+
+

3.3.4 (2014-04-03)

+
+

Features added

+
    +
  • Source line numbers above 65535 are available on Elements when +using libxml2 2.9 or later.
  • +
+
+
+

Bugs fixed

+
    +
  • lxml.html.fragment_fromstring() failed for bytes input in Py3.
  • +
+
+
+

Other changes

+
+
+
+

3.3.3 (2014-03-04)

+
+

Bugs fixed

+
    +
  • LP#1287118: Crash when using Element subtypes with __slots__.
  • +
+
+
+

Other changes

+
    +
  • The internal classes _LogEntry and _Attrib can no longer be +subclassed from Python code.
  • +
+
+
+
+

3.3.2 (2014-02-26)

+
+

Bugs fixed

+
    +
  • The properties resolvers and version, as well as the methods +set_element_class_lookup() and makeelement(), were lost from +iterparse objects in 3.3.0.
  • +
  • LP#1222132: instances of XMLSchema, Schematron and RelaxNG +did not clear their local error_log before running a validation.
  • +
  • LP#1238500: lxml.doctestcompare mixed up "expected" and "actual" in +attribute values.
  • +
  • Some file I/O tests were failing in MS-Windows due to non-portable temp +file usage. Initial patch by Gabi Davar.
  • +
  • LP#910014: duplicate IDs in a document were not reported by DTD validation.
  • +
  • LP#1185332: tostring(method="html") did not use HTML serialisation +semantics for trailing tail text. Initial patch by Sylvain Viollon.
  • +
  • LP#1281139: .attrib value of Comments lost its mutation methods +in 3.3.0. Even though it is empty and immutable, it should still +provide the same interface as that returned for Elements.
  • +
+
+
+
+

3.3.1 (2014-02-12)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • LP#1014290: HTML documents parsed with parser.feed() failed to find +elements during tag iteration.
  • +
  • LP#1273709: Building in PyPy failed due to missing support for +PyUnicode_Compare() and PyByteArray_*() in PyPy's C-API.
  • +
  • LP#1274413: Compilation in MSVC failed due to missing "stdint.h" standard +header file.
  • +
  • LP#1274118: iterparse() failed to parse BOM prefixed files.
  • +
+
+
+

Other changes

+
+
+
+

3.3.0 (2014-01-26)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • The heuristic that distinguishes file paths from URLs was tightened +to produce less false negatives.
  • +
+
+
+

Other changes

+
+
+
+

3.3.0beta5 (2014-01-18)

+
+

Features added

+
    +
  • The PEP 393 unicode parsing support gained a fallback for wchar strings +which might still be somewhat common on Windows systems.
  • +
+
+
+

Bugs fixed

+
    +
  • Several error handling problems were fixed throughout the code base that +could previously lead to exceptions being silently swallowed or not +properly reported.
  • +
  • The C-API function appendChild() is now deprecated as it does not +propagate exceptions (its return type is void). The new function +appendChildToElement() was added as a safe replacement.
  • +
  • Passing a string into fromstringlist() raises an exception instead of +parsing the string character by character.
  • +
+
+
+

Other changes

+
    +
  • Document cleanup code was simplified using the new GC features in +Cython 0.20.
  • +
+
+
+
+

3.3.0beta4 (2014-01-12)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • The (empty) value returned by the attrib property of Entity and Comment +objects was mutable.
  • +
  • Element class lookup wasn't available for the new pull parsers or when using +a custom parser target.
  • +
  • Setting Element attributes on instantiation with both the attrib argument +and keyword arguments could modify the mapping passed as attrib.
  • +
  • LP#1266171: DTDs instantiated from internal/external subsets (i.e. through +the docinfo property) lost their attribute declarations.
  • +
+
+
+

Other changes

+
    +
  • Built with Cython 0.20pre (gitrev 012ae82eb) to prepare support for +Python 3.4.
  • +
+
+
+
+

3.3.0beta3 (2014-01-02)

+
+

Features added

+
    +
  • Unicode string parsing was optimised for Python 3.3 (PEP 393).
  • +
+
+
+

Bugs fixed

+
    +
  • HTML parsing of Unicode strings could misdecode the input on some platforms.
  • +
  • Crash in xmlfile() when closing open elements out of order in an error case.
  • +
+
+
+

Other changes

+
+
+
+

3.3.0beta2 (2013-12-20)

+
+

Features added

+
    +
  • iterparse() supports the recover option.
  • +
+
+
+

Bugs fixed

+
    +
  • Crash in iterparse() for HTML parsing.
  • +
  • Crash in target parsing with attributes.
  • +
+
+
+

Other changes

+
    +
  • The safety check in the read-only tree implementation (e.g. used by +PythonElementClassLookup) raises a more appropriate ReferenceError +for illegal access after tree disposal instead of an AssertionError. +This should only impact test code that specifically checks the original +behaviour.
  • +
+
+
+
+

3.3.0beta1 (2013-12-12)

+
+

Features added

+
    +
  • New option handle_failures in make_links_absolute() and +resolve_base_href() (lxml.html) that enables ignoring or +discarding links that fail to parse as URLs.
  • +
  • New parser classes XMLPullParser and HTMLPullParser for +incremental parsing, as implemented for ElementTree in Python 3.4.
  • +
  • iterparse() enables recovery mode by default for HTML parsing +(html=True).
  • +
+
+
+

Bugs fixed

+
    +
  • LP#1255132: crash when trying to run validation over non-Element (e.g. +comment or PI).
  • +
  • Error messages in the log and in exception messages that originated +from libxml2 could accidentally be picked up from preceding warnings +instead of the actual error.
  • +
  • The ElementMaker in lxml.objectify did not accept a dict as +argument for adding attributes to the element it's building. This +works as in lxml.builder now.
  • +
  • LP#1228881: repr(XSLTAccessControl) failed in Python 3.
  • +
  • Raise ValueError when trying to append an Element to itself or +to one of its own descendants, instead of running into an infinite +loop.
  • +
  • LP#1206077: htmldiff discarded whitespace from the output.
  • +
  • Compressed plain-text serialisation to file-like objects was broken.
  • +
  • lxml.html.formfill: Fix textarea form filling. +The textarea used to be cleared before the new content was set, +which removed the name attribute.
  • +
+
+
+

Other changes

+
    +
  • Some basic API classes use freelists internally for faster +instantiation. This can speed up some iterparse() scenarios, +for example.
  • +
  • iterparse() was rewritten to use the new *PullParser +classes internally instead of being a parser itself.
  • +
+
+
+
+

3.2.5 (2014-01-02)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • Crash in xmlfile() when closing open elements out of order in an error case.
  • +
  • Crash in target parsing with attributes.
  • +
  • LP#1255132: crash when trying to run validation over non-Element (e.g. +comment or PI).
  • +
+
+
+

Other changes

+
+
+
+

3.2.4 (2013-11-07)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • Memory leak when creating an XPath evaluator in a thread.
  • +
  • LP#1228881: repr(XSLTAccessControl) failed in Python 3.
  • +
  • Raise ValueError when trying to append an Element to itself or +to one of its own descendants.
  • +
  • LP#1206077: htmldiff discarded whitespace from the output.
  • +
  • Compressed plain-text serialisation to file-like objects was broken.
  • +
+
+
+

Other changes

+
+
+
+

3.2.3 (2013-07-28)

+
+

Bugs fixed

+
    +
  • Fix support for Python 2.4 which was lost in 3.2.2.
  • +
+
+
+
+

3.2.2 (2013-07-28)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • LP#1185701: spurious XMLSyntaxError after finishing iterparse().
  • +
  • Crash in lxml.objectify during xsi annotation.
  • +
+
+
+

Other changes

+
    +
  • Return values of user provided element class lookup methods are now +validated against the type of the XML node they represent to prevent +API class mismatches.
  • +
+
+
+
+

3.2.1 (2013-05-11)

+
+

Features added

+
    +
  • The methods apply_templates() and process_children() of XSLT +extension elements have gained two new boolean options elements_only +and remove_blank_text that discard either all strings or whitespace-only +strings from the result list.
  • +
+
+
+

Bugs fixed

+
    +
  • When moving Elements to another tree, the namespace cleanup mechanism +no longer drops namespace prefixes from attributes for which it finds +a default namespace declaration, to prevent them from appearing as +unnamespaced attributes after serialisation.
  • +
  • Returning non-type objects from a custom class lookup method could lead +to a crash.
  • +
  • Instantiating and using subtypes of Comments and ProcessingInstructions +crashed.
  • +
+
+
+

Other changes

+
+
+
+

3.2.0 (2013-04-28)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • LP#690319: Leading whitespace could change the behaviour of the string +parsing functions in lxml.html.
  • +
  • LP#599318: The string parsing functions in lxml.html are more robust +in the face of uncommon HTML content like framesets or missing body tags. +Patch by Stefan Seelmann.
  • +
  • LP#712941: I/O errors while trying to access files with paths that contain +non-ASCII characters could raise UnicodeDecodeError instead of properly +reporting the IOError.
  • +
  • LP#673205: Parsing from in-memory strings disabled network access in the +default parser and made subsequent attempts to parse from a URL fail.
  • +
  • LP#971754: lxml.html.clean appends 'nofollow' to 'rel' attributes instead +of overwriting the current value.
  • +
  • LP#715687: lxml.html.clean no longer discards scripts that are explicitly +allowed by the user provided whitelist. Patch by Christine Koppelt.
  • +
+
+
+

Other changes

+
+
+
+

3.1.2 (2013-04-12)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • LP#1136509: Passing attributes through the namespace-unaware API of +the sax bridge (i.e. the handler.startElement() method) failed +with a TypeError. Patch by Mike Bayer.
  • +
  • LP#1123074: Fix serialisation error in XSLT output when converting +the result tree to a Unicode string.
  • +
  • GH#105: Replace illegal usage of xmlBufLength() in libxml2 2.9.0 +by properly exported API function xmlBufUse().
  • +
+
+
+

Other changes

+
+
+
+

3.1.1 (2013-03-29)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • LP#1160386: Write access to lxml.html.FormElement.fields raised +an AttributeError in Py3.
  • +
  • Illegal memory access during cleanup in incremental xmlfile writer.
  • +
+
+
+

Other changes

+
    +
  • The externally useless class lxml.etree._BaseParser was removed +from the module dict.
  • +
+
+
+
+

3.1.0 (2013-02-10)

+
+

Features added

+
    +
  • GH#89: lxml.html.clean allows overriding the set of attributes that it +considers 'safe'. Patch by Francis Devereux.
  • +
+
+
+

Bugs fixed

+
    +
  • LP#1104370: copy.copy(el.attrib) raised an exception. It now returns +a copy of the attributes as a plain Python dict.
  • +
  • GH#95: When used with namespace prefixes, the el.find*() methods +always used the first namespace mapping that was provided for each +path expression instead of using the one that was actually passed +in for the current run.
  • +
  • LP#1092521, GH#91: Fix undefined C symbol in Python runtimes compiled +without threading support. Patch by Ulrich Seidl.
  • +
+
+
+

Other changes

+
+
+
+

3.1beta1 (2012-12-21)

+
+

Features added

+
    +
  • New build-time option --with-unicode-strings for Python 2 that +makes the API always return Unicode strings for names and text +instead of byte strings for plain ASCII content.
  • +
  • New incremental XML file writing API etree.xmlfile().
  • +
  • E factory in lxml.objectify is callable to simplify the creation of +tags with non-identifier names without having to resort to getattr().
  • +
+
+
+

Bugs fixed

+
    +
  • When starting from a non-namespaced element in lxml.objectify, searching +for a child without explicitly specifying a namespace incorrectly found +namespaced elements with the requested local name, instead of restricting +the search to non-namespaced children.
  • +
  • GH#85: Deprecation warnings were fixed for Python 3.x.
  • +
  • GH#33: lxml.html.fromstring() failed to accept bytes input in Py3.
  • +
  • LP#1080792: Static build of libxml2 2.9.0 failed due to missing file.
  • +
+
+
+

Other changes

+
    +
  • The externally useless class _ObjectifyElementMakerCaller was +removed from the module API of lxml.objectify.
  • +
  • LP#1075622: lxml.builder is faster for adding text to elements with +many children. Patch by Anders Hammarquist.
  • +
+
+
+
+

3.0.2 (2012-12-14)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • Fix crash during interpreter shutdown by switching to Cython 0.17.3 for building.
  • +
+
+
+

Other changes

+
+
+
+

3.0.1 (2012-10-14)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • LP#1065924: Element proxies could disappear during garbage collection +in PyPy without proper cleanup.
  • +
  • GH#71: Failure to work with libxml2 2.6.x.
  • +
  • LP#1065139: static MacOS-X build failed in Py3.
  • +
+
+
+

Other changes

+
+
+
+

3.0 (2012-10-08)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • End-of-file handling was incorrect in iterparse() when reading from +a low-level C file stream and failed in libxml2 2.9.0 due to its +improved consistency checks.
  • +
+
+
+

Other changes

+
    +
  • The build no longer uses Cython by default unless the generated C files +are missing. To use Cython, pass the option "--with-cython". To ignore +the fatal build error when Cython is required but not available (e.g. to +run special setup.py commands that do not actually run a build), pass +"--without-cython".
  • +
+
+
+
+

3.0beta1 (2012-09-26)

+
+

Features added

+
    +
  • Python level access to (optional) libxml2 memory debugging features +to simplify debugging of memory leaks etc.
  • +
+
+
+

Bugs fixed

+
    +
  • Fix a memory leak in XPath by switching to Cython 0.17.1.
  • +
  • Some tests were adapted to work with PyPy.
  • +
+
+
+

Other changes

+
    +
  • The code was adapted to work with the upcoming libxml2 2.9.0 release.
  • +
+
+
+
+

3.0alpha2 (2012-08-23)

+
+

Features added

+
    +
  • The .iter() method of elements now accepts tag arguments like +"{*}name" to search for elements with a given local name in any +namespace. With this addition, all combinations of wildcards now work +as expected: +"{ns}name", "{}name", "{*}name", "{ns}*", "{}*" +and "{*}*". Note that "name" is equivalent to "{}name", +but "*" is "{*}*". +The same change applies to the .getiterator(), .itersiblings(), +.iterancestors(), .iterdescendants(), .iterchildren() +and .itertext() methods;the strip_attributes(), +strip_elements() and strip_tags() functions as well as the +iterparse() class. Patch by Simon Sapin.
  • +
  • C14N allows specifying the inclusive prefixes to be promoted +to top-level during exclusive serialisation.
  • +
+
+
+

Bugs fixed

+
    +
  • Passing long Unicode strings into the feed() parser interface +failed to read the entire string.
  • +
+
+
+

Other changes

+
+
+
+

3.0alpha1 (2012-07-31)

+
+

Features added

+
    +
  • Initial support for building in PyPy (through cpyext).
  • +
  • DTD objects gained an API that allows read access to their +declarations.
  • +
  • xpathgrep.py gained support for parsing line-by-line (e.g. +from grep output) and for surrounding the output with a new root +tag.
  • +
  • E-factory in lxml.builder accepts subtypes of known data +types (such as string subtypes) when building elements around them.
  • +
  • Tree iteration and iterparse() with a selective tag +argument supports passing a set of tags. Tree nodes will be +returned by the iterators if they match any of the tags.
  • +
+
+
+

Bugs fixed

+
    +
  • The .find*() methods in lxml.objectify no longer use XPath +internally, which makes them faster in many cases (especially when +short circuiting after a single or couple of elements) and fixes +some behavioural differences compared to lxml.etree. Note that +this means that they no longer support arbitrary XPath expressions +but only the subset that the ElementPath language supports. +The previous implementation was also redundant with the normal +XPath support, which can be used as a replacement.
  • +
  • el.find('*') could accidentally return a comment or processing +instruction that happened to be in the wrong spot. (Same for the +other .find*() methods.)
  • +
  • The error logging is less intrusive and avoids a global setup where +possible.
  • +
  • Fixed undefined names in html5lib parser.
  • +
  • xpathgrep.py did not work in Python 3.
  • +
  • Element.attrib.update() did not accept an attrib of +another Element as parameter.
  • +
  • For subtypes of ElementBase that make the .text or .tail +properties immutable (as in objectify, for example), inserting text +when creating Elements through the E-Factory feature of the class +constructor would fail with an exception, stating that the text +cannot be modified.
  • +
+
+
+

Other changes

+
    +
  • The code base was overhauled to properly use 'const' where the API +of libxml2 and libxslt requests it. This also has an impact on the +public C-API of lxml itself, as defined in etreepublic.pxd, as +well as the provided declarations in the lxml/includes/ directory. +Code that uses these declarations may have to be adapted. On the +plus side, this fixes several C compiler warnings, also for user +code, thus making it easier to spot real problems again.
  • +
  • The functionality of "lxml.cssselect" was moved into a separate PyPI +package called "cssselect". To continue using it, you must install +that package separately. The "lxml.cssselect" module is still +available and provides the same interface, provided the "cssselect" +package can be imported at runtime.
  • +
  • Element attributes passed in as an attrib dict or as keyword +arguments are now sorted by (namespaced) name before being created +to make their order predictable for serialisation and iteration. +Note that adding or deleting attributes afterwards does not take +that order into account, i.e. setting a new attribute appends it +after the existing ones.
  • +
  • Several classes that are for internal use only were removed +from the lxml.etree module dict: +_InputDocument, _ResolverRegistry, _ResolverContext, _BaseContext, +_ExsltRegExp, _IterparseContext, _TempStore, _ExceptionContext, +__ContentOnlyElement, _AttribIterator, _NamespaceRegistry, +_ClassNamespaceRegistry, _FunctionNamespaceRegistry, +_XPathFunctionNamespaceRegistry, _ParserDictionaryContext, +_FileReaderContext, _ParserContext, _PythonSaxParserTarget, +_TargetParserContext, _ReadOnlyProxy, _ReadOnlyPIProxy, +_ReadOnlyEntityProxy, _ReadOnlyElementProxy, _OpaqueNodeWrapper, +_OpaqueDocumentWrapper, _ModifyContentOnlyProxy, +_ModifyContentOnlyPIProxy, _ModifyContentOnlyEntityProxy, +_AppendOnlyElementProxy, _SaxParserContext, _FilelikeWriter, +_ParserSchemaValidationContext, _XPathContext, +_XSLTResolverContext, _XSLTContext, _XSLTQuotedStringParam
  • +
  • Several internal classes can no longer be inherited from: +_InputDocument, _ResolverRegistry, _ExsltRegExp, _ElementUnicodeResult, +_IterparseContext, _TempStore, _AttribIterator, _ClassNamespaceRegistry, +_XPathFunctionNamespaceRegistry, _ParserDictionaryContext, +_FileReaderContext, _PythonSaxParserTarget, _TargetParserContext, +_ReadOnlyPIProxy, _ReadOnlyEntityProxy, _OpaqueDocumentWrapper, +_ModifyContentOnlyPIProxy, _ModifyContentOnlyEntityProxy, +_AppendOnlyElementProxy, _FilelikeWriter, _ParserSchemaValidationContext, +_XPathContext, _XSLTResolverContext, _XSLTContext, _XSLTQuotedStringParam, +_XSLTResultTree, _XSLTProcessingInstruction
  • +
+
+
+
+

2.3.6 (2012-09-28)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • Passing long Unicode strings into the feed() parser interface +failed to read the entire string.
  • +
+
+
+

Other changes

+
+
+
+

2.3.5 (2012-07-31)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • Crash when merging text nodes in element.remove().
  • +
  • Crash in sax/target parser when reporting empty doctype.
  • +
+
+
+

Other changes

+
+
+
+

2.3.4 (2012-03-26)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • Crash when building an nsmap (Element property) with empty +namespace URIs.
  • +
  • Crash due to race condition when errors (or user messages) occur +during threaded XSLT processing.
  • +
  • XSLT stylesheet compilation could ignore compilation errors.
  • +
+
+
+

Other changes

+
+
+
+

2.3.3 (2012-01-04)

+
+

Features added

+
    +
  • lxml.html.tostring() gained new serialisation options +with_tail and doctype.
  • +
+
+
+

Bugs fixed

+
    +
  • Fixed a crash when using iterparse() for HTML parsing and +requesting start events.
  • +
  • Fixed parsing of more selectors in cssselect. Whitespace before +pseudo-elements and pseudo-classes is significant as it is a +descendant combinator. +"E :pseudo" should parse the same as "E *:pseudo", not "E:pseudo". +Patch by Simon Sapin.
  • +
  • lxml.html.diff no longer raises an exception when hitting +'img' tags without 'src' attribute.
  • +
+
+
+

Other changes

+
+
+
+

2.3.2 (2011-11-11)

+
+

Features added

+
    +
  • lxml.objectify.deannotate() has a new boolean option +cleanup_namespaces to remove the objectify namespace +declarations (and generally clean up the namespace declarations) +after removing the type annotations.
  • +
  • lxml.objectify gained its own SubElement() function as a +copy of etree.SubElement to avoid an otherwise redundant import +of lxml.etree on the user side.
  • +
+
+
+

Bugs fixed

+
    +
  • Fixed the "descendant" bug in cssselect a second time (after a first +fix in lxml 2.3.1). The previous change resulted in a serious +performance regression for the XPath based evaluation of the +translated expression. Note that this breaks the usage of some of +the generated XPath expressions as XSLT location paths that +previously worked in 2.3.1.
  • +
  • Fixed parsing of some selectors in cssselect. Whitespace after combinators +">", "+" and "~" is now correctly ignored. Previously it was parsed as +a descendant combinator. For example, "div> .foo" was parsed the same as +"div>* .foo" instead of "div>.foo". Patch by Simon Sapin.
  • +
+
+
+

Other changes

+
+
+
+

2.3.1 (2011-09-25)

+
+

Features added

+
    +
  • New option kill_tags in lxml.html.clean to remove specific +tags and their content (i.e. their whole subtree).
  • +
  • pi.get() and pi.attrib on processing instructions to parse +pseudo-attributes from the text content of processing instructions.
  • +
  • lxml.get_include() returns a list of include paths that can be +used to compile external C code against lxml.etree. This is +specifically required for statically linked lxml builds when code +needs to compile against the exact same header file versions as lxml +itself.
  • +
  • Resolver.resolve_file() takes an additional option +close_file that configures if the file(-like) object will be +closed after reading or not. By default, the file will be closed, +as the user is not expected to keep a reference to it.
  • +
+
+
+

Bugs fixed

+
    +
  • HTML cleaning didn't remove 'data:' links.
  • +
  • The html5lib parser integration now uses the 'official' +implementation in html5lib itself, which makes it work with newer +releases of the library.
  • +
  • In lxml.sax, endElementNS() could incorrectly reject a plain +tag name when the corresponding start event inferred the same plain +tag name to be in the default namespace.
  • +
  • When an open file-like object is passed into parse() or +iterparse(), the parser will no longer close it after use. This +reverts a change in lxml 2.3 where all files would be closed. It is +the users responsibility to properly close the file(-like) object, +also in error cases.
  • +
  • Assertion error in lxml.html.cleaner when discarding top-level elements.
  • +
  • In lxml.cssselect, use the xpath 'A//B' (short for +'A/descendant-or-self::node()/B') instead of 'A/descendant::B' for +the css descendant selector ('A B'). This makes a few edge cases +like "div *:last-child" consistent with the selector behavior in +WebKit and Firefox, and makes more css expressions valid location +paths (for use in xsl:template match).
  • +
  • In lxml.html, non-selected <option> tags no longer show up in the +collected form values.
  • +
  • Adding/removing <option> values to/from a multiple select form +field properly selects them and unselects them.
  • +
+
+
+

Other changes

+
    +
  • Static builds can specify the download directory with the +--download-dir option.
  • +
+
+
+
+

2.3 (2011-02-06)

+
+

Features added

+
    +
  • When looking for children, lxml.objectify takes '{}tag' as +meaning an empty namespace, as opposed to the parent namespace.
  • +
+
+
+

Bugs fixed

+
    +
  • When finished reading from a file-like object, the parser +immediately calls its .close() method.
  • +
  • When finished parsing, iterparse() immediately closes the input +file.
  • +
  • Work-around for libxml2 bug that can leave the HTML parser in a +non-functional state after parsing a severely broken document (fixed +in libxml2 2.7.8).
  • +
  • marque tag in HTML cleanup code is correctly named marquee.
  • +
+
+
+

Other changes

+
    +
  • Some public functions in the Cython-level C-API have more explicit +return types.
  • +
+
+
+
+

2.3beta1 (2010-09-06)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • Crash in newer libxml2 versions when moving elements between +documents that had attributes on replaced XInclude nodes.
  • +
  • XMLID() function was missing the optional parser and +base_url parameters.
  • +
  • Searching for wildcard tags in iterparse() was broken in Py3.
  • +
  • lxml.html.open_in_browser() didn't work in Python 3 due to the +use of os.tempnam. It now takes an optional 'encoding' parameter.
  • +
+
+
+

Other changes

+
+
+
+

2.3alpha2 (2010-07-24)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • Crash in XSLT when generating text-only result documents with a +stylesheet created in a different thread.
  • +
+
+
+

Other changes

+
    +
  • repr() of Element objects shows the hex ID with leading 0x +(following ElementTree 1.3).
  • +
+
+
+
+

2.3alpha1 (2010-06-19)

+
+

Features added

+
    +
  • Keyword argument namespaces in lxml.cssselect.CSSSelector() +to pass a prefix-to-namespace mapping for the selector.
  • +
  • New function lxml.etree.register_namespace(prefix, uri) that +globally registers a namespace prefix for a namespace that newly +created Elements in that namespace will use automatically. Follows +ElementTree 1.3.
  • +
  • Support 'unicode' string name as encoding parameter in +tostring(), following ElementTree 1.3.
  • +
  • Support 'c14n' serialisation method in ElementTree.write() and +tostring(), following ElementTree 1.3.
  • +
  • The ElementPath expression syntax (el.find*()) was extended to +match the upcoming ElementTree 1.3 that will ship in the standard +library of Python 3.2/2.7. This includes extended support for +predicates as well as namespace prefixes (as known from XPath).
  • +
  • During regular XPath evaluation, various ESXLT functions are +available within their namespace when using libxslt 1.1.26 or later.
  • +
  • Support passing a readily configured logger instance into +PyErrorLog, instead of a logger name.
  • +
  • On serialisation, the new doctype parameter can be used to +override the DOCTYPE (internal subset) of the document.
  • +
  • New parameter output_parent to XSLTExtension.apply_templates() +to append the resulting content directly to an output element.
  • +
  • XSLTExtension.process_children() to process the content of the +XSLT extension element itself.
  • +
  • ISO-Schematron support based on the de-facto Schematron reference +'skeleton implementation'.
  • +
  • XSLT objects now take XPath object as __call__ stylesheet +parameters.
  • +
  • Enable path caching in ElementPath (el.find*()) to avoid parsing +overhead.
  • +
  • Setting the value of a namespaced attribute always uses a prefixed +namespace instead of the default namespace even if both declare the +same namespace URI. This avoids serialisation problems when an +attribute from a default namespace is set on an element from a +different namespace.
  • +
  • XSLT extension elements: support for XSLT context nodes other than +elements: document root, comments, processing instructions.
  • +
  • Support for strings (in addition to Elements) in node-sets returned +by extension functions.
  • +
  • Forms that lack an action attribute default to the base URL of +the document on submit.
  • +
  • XPath attribute result strings have an attrname property.
  • +
  • Namespace URIs get validated against RFC 3986 at the API level +(required by the XML namespace specification).
  • +
  • Target parsers show their target object in the .target property +(compatible with ElementTree).
  • +
+
+
+

Bugs fixed

+
    +
  • API is hardened against invalid proxy instances to prevent crashes +due to incorrectly instantiated Element instances.
  • +
  • Prevent crash when instantiating CommentBase and friends.
  • +
  • Export ElementTree compatible XML parser class as +XMLTreeBuilder, as it is called in ET 1.2.
  • +
  • ObjectifiedDataElements in lxml.objectify were not hashable. They +now use the hash value of the underlying Python value (string, +number, etc.) to which they compare equal.
  • +
  • Parsing broken fragments in lxml.html could fail if the fragment +contained an orphaned closing '</div>' tag.
  • +
  • Using XSLT extension elements around the root of the output document +crashed.
  • +
  • lxml.cssselect did not distinguish between x[attr="val"] and +x [attr="val"] (with a space). The latter now matches the +attribute independent of the element.
  • +
  • Rewriting multiple links inside of HTML text content could end up +replacing unrelated content as replacements could impact the +reported position of subsequent matches. Modifications are now +simplified by letting the iterlinks() generator in lxml.html +return links in reversed order if they appear inside the same text +node. Thus, replacements and link-internal modifications no longer +change the position of links reported afterwards.
  • +
  • The .value attribute of textarea elements in lxml.html did +not represent the complete raw value (including child tags etc.). It +now serialises the complete content on read and replaces the +complete content by a string on write.
  • +
  • Target parser didn't call .close() on the target object if +parsing failed. Now it is guaranteed that .close() will be +called after parsing, regardless of the outcome.
  • +
+
+
+

Other changes

+
    +
  • Official support for Python 3.1.2 and later.
  • +
  • Static MS Windows builds can now download their dependencies +themselves.
  • +
  • Element.attrib no longer uses a cyclic reference back to its +Element object. It therefore no longer requires the garbage +collector to clean up.
  • +
  • Static builds include libiconv, in addition to libxml2 and libxslt.
  • +
+
+
+
+

2.2.8 (2010-09-02)

+
+

Bugs fixed

+
    +
  • Crash in newer libxml2 versions when moving elements between +documents that had attributes on replaced XInclude nodes.
  • +
  • Import fix for urljoin in Python 3.1+.
  • +
+
+
+
+

2.2.7 (2010-07-24)

+
+

Bugs fixed

+
    +
  • Crash in XSLT when generating text-only result documents with a +stylesheet created in a different thread.
  • +
+
+
+
+

2.2.6 (2010-03-02)

+
+

Bugs fixed

+
    +
  • Fixed several Python 3 regressions by building with Cython 0.11.3.
  • +
+
+
+
+

2.2.5 (2010-02-28)

+
+

Features added

+
    +
  • Support for running XSLT extension elements on the input root node +(e.g. in a template matching on "/").
  • +
+
+
+

Bugs fixed

+
    +
  • Crash in XPath evaluation when reading smart strings from a document +other than the original context document.
  • +
  • Support recent versions of html5lib by not requiring its +XHTMLParser in htmlparser.py anymore.
  • +
  • Manually instantiating the custom element classes in +lxml.objectify could crash.
  • +
  • Invalid XML text characters were not rejected by the API when they +appeared in unicode strings directly after non-ASCII characters.
  • +
  • lxml.html.open_http_urllib() did not work in Python 3.
  • +
  • The functions strip_tags() and strip_elements() in +lxml.etree did not remove all occurrences of a tag in all cases.
  • +
  • Crash in XSLT extension elements when the XSLT context node is not +an element.
  • +
+
+
+
+

2.2.4 (2009-11-11)

+
+

Bugs fixed

+
    +
  • Static build of libxml2/libxslt was broken.
  • +
+
+
+
+

2.2.3 (2009-10-30)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • The resolve_entities option did not work in the incremental feed +parser.
  • +
  • Looking up and deleting attributes without a namespace could hit a +namespaced attribute of the same name instead.
  • +
  • Late errors during calls to SubElement() (e.g. attribute related +ones) could leave a partially initialised element in the tree.
  • +
  • Modifying trees that contain parsed entity references could result +in an infinite loop.
  • +
  • ObjectifiedElement.__setattr__ created an empty-string child element when the +attribute value was rejected as a non-unicode/non-ascii string
  • +
  • Syntax errors in lxml.cssselect could result in misleading error +messages.
  • +
  • Invalid syntax in CSS expressions could lead to an infinite loop in +the parser of lxml.cssselect.
  • +
  • CSS special character escapes were not properly handled in +lxml.cssselect.
  • +
  • CSS Unicode escapes were not properly decoded in lxml.cssselect.
  • +
  • Select options in HTML forms that had no explicit value +attribute were not handled correctly. The HTML standard dictates +that their value is defined by their text content. This is now +supported by lxml.html.
  • +
  • XPath raised a TypeError when finding CDATA sections. This is now +fully supported.
  • +
  • Calling help(lxml.objectify) didn't work at the prompt.
  • +
  • The ElementMaker in lxml.objectify no longer defines the default +namespaces when annotation is disabled.
  • +
  • Feed parser failed to honour the 'recover' option on parse errors.
  • +
  • Diverting the error logging to Python's logging system was broken.
  • +
+
+
+

Other changes

+
+
+
+

2.2.2 (2009-06-21)

+
+

Features added

+
    +
  • New helper functions strip_attributes(), strip_elements(), +strip_tags() in lxml.etree to remove attributes/subtrees/tags +from a subtree.
  • +
+
+
+

Bugs fixed

+
    +
  • Namespace cleanup on subtree insertions could result in missing +namespace declarations (and potentially crashes) if the element +defining a namespace was deleted and the namespace was not used by +the top element of the inserted subtree but only in deeper subtrees.
  • +
  • Raising an exception from a parser target callback didn't always +terminate the parser.
  • +
  • Only {true, false, 1, 0} are accepted as the lexical representation for +BoolElement ({True, False, T, F, t, f} not any more), restoring lxml <= 2.0 +behaviour.
  • +
+
+
+

Other changes

+
+
+
+

2.2.1 (2009-06-02)

+
+

Features added

+
    +
  • Injecting default attributes into a document during XML Schema +validation (also at parse time).
  • +
  • Pass huge_tree parser option to disable parser security +restrictions imposed by libxml2 2.7.
  • +
+
+
+

Bugs fixed

+
    +
  • The script for statically building libxml2 and libxslt didn't work +in Py3.
  • +
  • XMLSchema() also passes invalid schema documents on to libxml2 +for parsing (which could lead to a crash before release 2.6.24).
  • +
+
+
+

Other changes

+
+
+
+

2.2 (2009-03-21)

+
+

Features added

+
    +
  • Support for standalone flag in XML declaration through +tree.docinfo.standalone and by passing standalone=True/False +on serialisation.
  • +
+
+
+

Bugs fixed

+
    +
  • Crash when parsing an XML Schema with external imports from a +filename.
  • +
+
+
+
+

2.2beta4 (2009-02-27)

+
+

Features added

+
    +
  • Support strings and instantiable Element classes as child arguments +to the constructor of custom Element classes.
  • +
  • GZip compression support for serialisation to files and file-like +objects.
  • +
+
+
+

Bugs fixed

+
    +
  • Deep-copying an ElementTree copied neither its sibling PIs and +comments nor its internal/external DTD subsets.
  • +
  • Soupparser failed on broken attributes without values.
  • +
  • Crash in XSLT when overwriting an already defined attribute using +xsl:attribute.
  • +
  • Crash bug in exception handling code under Python 3. This was due +to a problem in Cython, not lxml itself.
  • +
  • lxml.html.FormElement._name() failed for non top-level forms.
  • +
  • TAG special attribute in constructor of custom Element classes +was evaluated incorrectly.
  • +
+
+
+

Other changes

+
    +
  • Official support for Python 3.0.1.
  • +
  • Element.findtext() now returns an empty string instead of None +for Elements without text content.
  • +
+
+
+
+

2.2beta3 (2009-02-17)

+
+

Features added

+
    +
  • XSLT.strparam() class method to wrap quoted string parameters +that require escaping.
  • +
+
+
+

Bugs fixed

+
    +
  • Memory leak in XPath evaluators.
  • +
  • Crash when parsing indented XML in one thread and merging it with +other documents parsed in another thread.
  • +
  • Setting the base attribute in lxml.objectify from a unicode +string failed.
  • +
  • Fixes following changes in Python 3.0.1.
  • +
  • Minor fixes for Python 3.
  • +
+
+
+

Other changes

+
    +
  • The global error log (which is copied into the exception log) is now +local to a thread, which fixes some race conditions.
  • +
  • More robust error handling on serialisation.
  • +
+
+
+
+

2.2beta2 (2009-01-25)

+
+

Bugs fixed

+
    +
  • Potential memory leak on exception handling. This was due to a +problem in Cython, not lxml itself.
  • +
  • iter_links (and related link-rewriting functions) in +lxml.html would interpret CSS like url("link") incorrectly +(treating the quotation marks as part of the link).
  • +
  • Failing import on systems that have an io module.
  • +
+
+
+
+

2.1.5 (2009-01-06)

+
+

Bugs fixed

+
    +
  • Potential memory leak on exception handling. This was due to a +problem in Cython, not lxml itself.
  • +
  • Failing import on systems that have an io module.
  • +
+
+
+
+

2.2beta1 (2008-12-12)

+
+

Features added

+
    +
  • Allow lxml.html.diff.htmldiff to accept Element objects, not +just HTML strings.
  • +
+
+
+

Bugs fixed

+
    +
  • Crash when using an XPath evaluator in multiple threads.
  • +
  • Fixed missing whitespace before Link:... in lxml.html.diff.
  • +
+
+
+

Other changes

+
    +
  • Export lxml.html.parse.
  • +
+
+
+
+

2.1.4 (2008-12-12)

+
+

Bugs fixed

+
    +
  • Crash when using an XPath evaluator in multiple threads.
  • +
+
+
+
+

2.0.11 (2008-12-12)

+
+

Bugs fixed

+
    +
  • Crash when using an XPath evaluator in multiple threads.
  • +
+
+
+
+

2.2alpha1 (2008-11-23)

+
+

Features added

+
    +
  • Support for XSLT result tree fragments in XPath/XSLT extension +functions.
  • +
  • QName objects have new properties namespace and localname.
  • +
  • New options for exclusive C14N and C14N without comments.
  • +
  • Instantiating a custom Element classes creates a new Element.
  • +
+
+
+

Bugs fixed

+
    +
  • XSLT didn't inherit the parse options of the input document.
  • +
  • 0-bytes could slip through the API when used inside of Unicode +strings.
  • +
  • With lxml.html.clean.autolink, links with balanced parenthesis, +that end in a parenthesis, will be linked in their entirety (typical +with Wikipedia links).
  • +
+
+
+

Other changes

+
+
+
+

2.1.3 (2008-11-17)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • Ref-count leaks when lxml enters a try-except statement while an +outside exception lives in sys.exc_*(). This was due to a problem in +Cython, not lxml itself.
  • +
  • Parser Unicode decoding errors could get swallowed by other +exceptions.
  • +
  • Name/import errors in some Python modules.
  • +
  • Internal DTD subsets that did not specify a system or public ID were +not serialised and did not appear in the docinfo property of +ElementTrees.
  • +
  • Fix a pre-Py3k warning when parsing from a gzip file in Py2.6.
  • +
  • Test suite fixes for libxml2 2.7.
  • +
  • Resolver.resolve_string() did not work for non-ASCII byte strings.
  • +
  • Resolver.resolve_file() was broken.
  • +
  • Overriding the parser encoding didn't work for many encodings.
  • +
+
+
+

Other changes

+
+
+
+

2.0.10 (2008-11-17)

+
+

Bugs fixed

+
    +
  • Ref-count leaks when lxml enters a try-except statement while an +outside exception lives in sys.exc_*(). This was due to a problem in +Cython, not lxml itself.
  • +
+
+
+
+

2.1.2 (2008-09-05)

+
+

Features added

+
    +
  • lxml.etree now tries to find the absolute path name of files when +parsing from a file-like object. This helps custom resolvers when +resolving relative URLs, as lixbml2 can prepend them with the path +of the source document.
  • +
+
+
+

Bugs fixed

+
    +
  • Memory problem when passing documents between threads.
  • +
  • Target parser did not honour the recover option and raised an +exception instead of calling .close() on the target.
  • +
+
+
+

Other changes

+
+
+
+

2.0.9 (2008-09-05)

+
+

Bugs fixed

+
    +
  • Memory problem when passing documents between threads.
  • +
  • Target parser did not honour the recover option and raised an +exception instead of calling .close() on the target.
  • +
+
+
+
+

2.1.1 (2008-07-24)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • Crash when parsing XSLT stylesheets in a thread and using them in +another.
  • +
  • Encoding problem when including text with ElementInclude under +Python 3.
  • +
+
+
+

Other changes

+
+
+
+

2.0.8 (2008-07-24)

+
+

Features added

+
    +
  • lxml.html.rewrite_links() strips links to work around documents +with whitespace in URL attributes.
  • +
+
+
+

Bugs fixed

+
    +
  • Crash when parsing XSLT stylesheets in a thread and using them in +another.
  • +
  • CSS selector parser dropped remaining expression after a function +with parameters.
  • +
+
+
+

Other changes

+
+
+
+

2.1 (2008-07-09)

+
+

Features added

+
    +
  • Smart strings can be switched off in XPath (smart_strings +keyword option).
  • +
  • lxml.html.rewrite_links() strips links to work around documents +with whitespace in URL attributes.
  • +
+
+
+

Bugs fixed

+
    +
  • Custom resolvers were not used for XMLSchema includes/imports and +XInclude processing.
  • +
  • CSS selector parser dropped remaining expression after a function +with parameters.
  • +
+
+
+

Other changes

+
    +
  • objectify.enableRecursiveStr() was removed, use +objectify.enable_recursive_str() instead
  • +
  • Speed-up when running XSLTs on documents from other threads
  • +
+
+
+
+

2.0.7 (2008-06-20)

+
+

Features added

+
    +
  • Pickling ElementTree objects in lxml.objectify.
  • +
+
+
+

Bugs fixed

+
    +
  • Descending dot-separated classes in CSS selectors were not resolved +correctly.
  • +
  • ElementTree.parse() didn't handle target parser result.
  • +
  • Potential threading problem in XInclude.
  • +
  • Crash in Element class lookup classes when the __init__() method of +the super class is not called from Python subclasses.
  • +
+
+
+

Other changes

+
    +
  • Non-ASCII characters in attribute values are no longer escaped on +serialisation.
  • +
+
+
+
+

2.1beta3 (2008-06-19)

+
+

Features added

+
    +
  • Major overhaul of tools/xpathgrep.py script.
  • +
  • Pickling ElementTree objects in lxml.objectify.
  • +
  • Support for parsing from file-like objects that return unicode +strings.
  • +
  • New function etree.cleanup_namespaces(el) that removes unused +namespace declarations from a (sub)tree (experimental).
  • +
  • XSLT results support the buffer protocol in Python 3.
  • +
  • Polymorphic functions in lxml.html that accept either a tree or +a parsable string will return either a UTF-8 encoded byte string, a +unicode string or a tree, based on the type of the input. +Previously, the result was always a byte string or a tree.
  • +
  • Support for Python 2.6 and 3.0 beta.
  • +
  • File name handling now uses a heuristic to convert between byte +strings (usually filenames) and unicode strings (usually URLs).
  • +
  • Parsing from a plain file object frees the GIL under Python 2.x.
  • +
  • Running iterparse() on a plain file (or filename) frees the GIL +on reading under Python 2.x.
  • +
  • Conversion functions html_to_xhtml() and xhtml_to_html() in +lxml.html (experimental).
  • +
  • Most features in lxml.html work for XHTML namespaced tag names +(experimental).
  • +
+
+
+

Bugs fixed

+
    +
  • ElementTree.parse() didn't handle target parser result.
  • +
  • Crash in Element class lookup classes when the __init__() method of +the super class is not called from Python subclasses.
  • +
  • A number of problems related to unicode/byte string conversion of +filenames and error messages were fixed.
  • +
  • Building on MacOS-X now passes the "flat_namespace" option to the C +compiler, which reportedly prevents build quirks and crashes on this +platform.
  • +
  • Windows build was broken.
  • +
  • Rare crash when serialising to a file object with certain encodings.
  • +
+
+
+

Other changes

+
    +
  • Non-ASCII characters in attribute values are no longer escaped on +serialisation.
  • +
  • Passing non-ASCII byte strings or invalid unicode strings as .tag, +namespaces, etc. will result in a ValueError instead of an +AssertionError (just like the tag well-formedness check).
  • +
  • Up to several times faster attribute access (i.e. tree traversal) in +lxml.objectify.
  • +
+
+
+
+

2.0.6 (2008-05-31)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • Incorrect evaluation of el.find("tag[child]").
  • +
  • Windows build was broken.
  • +
  • Moving a subtree from a document created in one thread into a +document of another thread could crash when the rest of the source +document is deleted while the subtree is still in use.
  • +
  • Rare crash when serialising to a file object with certain encodings.
  • +
+
+
+

Other changes

+
    +
  • lxml should now build without problems on MacOS-X.
  • +
+
+
+
+

2.1beta2 (2008-05-02)

+
+

Features added

+
    +
  • All parse functions in lxml.html take a parser keyword argument.
  • +
  • lxml.html has a new parser class XHTMLParser and a module +attribute xhtml_parser that provide XML parsers that are +pre-configured for the lxml.html package.
  • +
+
+
+

Bugs fixed

+
    +
  • Moving a subtree from a document created in one thread into a +document of another thread could crash when the rest of the source +document is deleted while the subtree is still in use.
  • +
  • Passing an nsmap when creating an Element will no longer strip +redundantly defined namespace URIs. This prevented the definition +of more than one prefix for a namespace on the same Element.
  • +
+
+
+

Other changes

+
    +
  • If the default namespace is redundantly defined with a prefix on the +same Element, the prefix will now be preferred for subelements and +attributes. This allows users to work around a problem in libxml2 +where attributes from the default namespace could serialise without +a prefix even when they appear on an Element with a different +namespace (i.e. they would end up in the wrong namespace).
  • +
+
+
+
+

2.0.5 (2008-05-01)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • Resolving to a filename in custom resolvers didn't work.
  • +
  • lxml did not honour libxslt's second error state "STOPPED", which +let some XSLT errors pass silently.
  • +
  • Memory leak in Schematron with libxml2 >= 2.6.31.
  • +
+
+
+

Other changes

+
+
+
+

2.1beta1 (2008-04-15)

+
+

Features added

+
    +
  • Error logging in Schematron (requires libxml2 2.6.32 or later).
  • +
  • Parser option strip_cdata for normalising or keeping CDATA +sections. Defaults to True as before, thus replacing CDATA +sections by their text content.
  • +
  • CDATA() factory to wrap string content as CDATA section.
  • +
+
+
+

Bugs fixed

+
    +
  • Resolving to a filename in custom resolvers didn't work.
  • +
  • lxml did not honour libxslt's second error state "STOPPED", which +let some XSLT errors pass silently.
  • +
  • Memory leak in Schematron with libxml2 >= 2.6.31.
  • +
  • lxml.etree accepted non well-formed namespace prefix names.
  • +
+
+
+

Other changes

+
    +
  • Major cleanup in internal moveNodeToDocument() function, which +takes care of namespace cleanup when moving elements between +different namespace contexts.
  • +
  • New Elements created through the makeelement() method of an HTML +parser or through lxml.html now end up in a new HTML document +(doctype HTML 4.01 Transitional) instead of a generic XML document. +This mostly impacts the serialisation and the availability of a DTD +context.
  • +
+
+
+
+

2.0.4 (2008-04-13)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • Hanging thread in conjunction with GTK threading.
  • +
  • Crash bug in iterparse when moving elements into other documents.
  • +
  • HTML elements' .cssselect() method was broken.
  • +
  • ElementTree.find*() didn't accept QName objects.
  • +
+
+
+

Other changes

+
+
+
+

2.1alpha1 (2008-03-27)

+
+

Features added

+
    +
  • New event types 'comment' and 'pi' in iterparse().
  • +
  • XSLTAccessControl instances have a property options that +returns a dict of access configuration options.
  • +
  • Constant instances DENY_ALL and DENY_WRITE on +XSLTAccessControl class.
  • +
  • Extension elements for XSLT (experimental!)
  • +
  • Element.base property returns the xml:base or HTML base URL of +an Element.
  • +
  • docinfo.URL property is writable.
  • +
+
+
+

Bugs fixed

+
    +
  • Default encoding for plain text serialisation was different from +that of XML serialisation (UTF-8 instead of ASCII).
  • +
+
+
+

Other changes

+
    +
  • Minor API speed-ups.
  • +
  • The benchmark suite now uses tail text in the trees, which makes the +absolute numbers incomparable to previous results.
  • +
  • Generating the HTML documentation now requires Pygments, which is +used to enable syntax highlighting for the doctest examples.
  • +
+

Most long-time deprecated functions and methods were removed:

+
    +
  • etree.clearErrorLog(), use etree.clear_error_log()

    +
  • +
  • etree.useGlobalPythonLog(), use +etree.use_global_python_log()

    +
  • +
  • etree.ElementClassLookup.setFallback(), use +etree.ElementClassLookup.set_fallback()

    +
  • +
  • etree.getDefaultParser(), use etree.get_default_parser()

    +
  • +
  • etree.setDefaultParser(), use etree.set_default_parser()

    +
  • +
  • etree.setElementClassLookup(), use +etree.set_element_class_lookup()

    +

    Note that parser.setElementClassLookup() has not been removed +yet, although parser.set_element_class_lookup() should be used +instead.

    +
  • +
  • xpath_evaluator.registerNamespace(), use +xpath_evaluator.register_namespace()

    +
  • +
  • xpath_evaluator.registerNamespaces(), use +xpath_evaluator.register_namespaces()

    +
  • +
  • objectify.setPytypeAttributeTag, use +objectify.set_pytype_attribute_tag

    +
  • +
  • objectify.setDefaultParser(), use +objectify.set_default_parser()

    +
  • +
+
+
+
+

2.0.3 (2008-03-26)

+
+

Features added

+
    +
  • soupparser.parse() allows passing keyword arguments on to +BeautifulSoup.
  • +
  • fromstring() method in lxml.html.soupparser.
  • +
+
+
+

Bugs fixed

+
    +
  • lxml.html.diff didn't treat empty tags properly (e.g., +<br>).
  • +
  • Handle entity replacements correctly in target parser.
  • +
  • Crash when using iterparse() with XML Schema validation.
  • +
  • The BeautifulSoup parser (soupparser.py) did not replace entities, +which made them turn up in text content.
  • +
  • Attribute assignment of custom PyTypes in objectify could fail to +correctly serialise the value to a string.
  • +
+
+
+

Other changes

+
    +
  • lxml.html.ElementSoup was replaced by a new module +lxml.html.soupparser with a more consistent API. The old module +remains for compatibility with ElementTree's own ElementSoup module.
  • +
  • Setting the XSLT_CONFIG and XML2_CONFIG environment variables at +build time will let setup.py pick up the xml2-config and +xslt-config scripts from the supplied path name.
  • +
  • Passing --with-xml2-config=/path/to/xml2-config to setup.py will +override the xml2-config script that is used to determine the C +compiler options. The same applies for the --with-xslt-config +option.
  • +
+
+
+
+

2.0.2 (2008-02-22)

+
+

Features added

+
    +
  • Support passing base_url to file parser functions to override +the filename of the file(-like) object.
  • +
+
+
+

Bugs fixed

+
    +
  • The prefix for objectify's pytype namespace was missing from the set +of default prefixes.
  • +
  • Memory leak in Schematron (fixed only for libxml2 2.6.31+).
  • +
  • Error type names in RelaxNG were reported incorrectly.
  • +
  • Slice deletion bug fixed in objectify.
  • +
+
+
+

Other changes

+
    +
  • Enabled doctests for some Python modules (especially lxml.html).
  • +
  • Add a method argument to lxml.html.tostring() +(method="xml" for XHTML output).
  • +
  • Make it clearer that methods like lxml.html.fromstring() take a +base_url argument.
  • +
+
+
+
+

2.0.1 (2008-02-13)

+
+

Features added

+
    +
  • Child iteration in lxml.pyclasslookup.
  • +
  • Loads of new docstrings reflect the signature of functions and +methods to make them visible in API docs and help()
  • +
+
+
+

Bugs fixed

+
    +
  • The module lxml.html.builder was duplicated as +lxml.htmlbuilder
  • +
  • Form elements would return None for form.fields.keys() if there +was an unnamed input field. Now unnamed input fields are completely +ignored.
  • +
  • Setting an element slice in objectify could insert slice-overlapping +elements at the wrong position.
  • +
+
+
+

Other changes

+
    +
  • The generated API documentation was cleaned up and disburdened from +non-public classes etc.
  • +
  • The previously public module lxml.html.setmixin was renamed to +lxml.html._setmixin as it is not an official part of lxml. If +you want to use it, feel free to copy it over to your own source +base.
  • +
  • Passing --with-xslt-config=/path/to/xslt-config to setup.py will +override the xslt-config script that is used to determine the C +compiler options.
  • +
+
+
+
+

2.0 (2008-02-01)

+
+

Features added

+
    +
  • Passing the unicode type as encoding to tostring() will +serialise to unicode. The tounicode() function is now +deprecated.
  • +
  • XMLSchema() and RelaxNG() can parse from StringIO.
  • +
  • makeparser() function in lxml.objectify to create a new +parser with the usual objectify setup.
  • +
  • Plain ASCII XPath string results are no longer forced into unicode +objects as in 2.0beta1, but are returned as plain strings as before.
  • +
  • All XPath string results are 'smart' objects that have a +getparent() method to retrieve their parent Element.
  • +
  • with_tail option in serialiser functions.
  • +
  • More accurate exception messages in validator creation.
  • +
  • Parse-time XML schema validation (schema parser keyword).
  • +
  • XPath string results of the text() function and attribute +selection make their Element container accessible through a +getparent() method. As a side-effect, they are now always +unicode objects (even ASCII strings).
  • +
  • XSLT objects are usable in any thread - at the cost of a deep +copy if they were not created in that thread.
  • +
  • Invalid entity names and character references will be rejected by +the Entity() factory.
  • +
  • entity.text returns the textual representation of the entity, +e.g. &amp;.
  • +
  • New properties position and code on ParseError exception (as +in ET 1.3)
  • +
  • Rich comparison of element.attrib proxies.
  • +
  • ElementTree compatible TreeBuilder class.
  • +
  • Use default prefixes for some common XML namespaces.
  • +
  • lxml.html.clean.Cleaner now allows for a host_whitelist, and +two overridable methods: allow_embedded_url(el, url) and the +more general allow_element(el).
  • +
  • Extended slicing of Elements as in element[1:-1:2], both in +etree and in objectify
  • +
  • Resolvers can now provide a base_url keyword argument when +resolving a document as string data.
  • +
  • When using lxml.doctestcompare you can give the doctest option +NOPARSE_MARKUP (like # doctest: +NOPARSE_MARKUP) to suppress +the special checking for one test.
  • +
  • Separate feed_error_log property for the feed parser interface. +The normal parser interface and iterparse continue to use +error_log.
  • +
  • The normal parsers and the feed parser interface are now separated +and can be used concurrently on the same parser instance.
  • +
  • fromstringlist() and tostringlist() functions as in +ElementTree 1.3
  • +
  • iterparse() accepts an html boolean keyword argument for +parsing with the HTML parser (note that this interface may be +subject to change)
  • +
  • Parsers accept an encoding keyword argument that overrides the encoding +of the parsed documents.
  • +
  • New C-API function hasChild() to test for children
  • +
  • annotate() function in objectify can annotate with Python types and XSI +types in one step. Accompanied by xsiannotate() and pyannotate().
  • +
  • ET.write(), tostring() and tounicode() now accept a keyword +argument method that can be one of 'xml' (or None), 'html' or 'text' to +serialise as XML, HTML or plain text content.
  • +
  • iterfind() method on Elements returns an iterator equivalent to +findall()
  • +
  • itertext() method on Elements
  • +
  • Setting a QName object as value of the .text property or as an attribute +will resolve its prefix in the respective context
  • +
  • ElementTree-like parser target interface as described in +http://effbot.org/elementtree/elementtree-xmlparser.htm
  • +
  • ElementTree-like feed parser interface on XMLParser and HTMLParser +(feed() and close() methods)
  • +
  • Reimplemented objectify.E for better performance and improved +integration with objectify. Provides extended type support based on +registered PyTypes.
  • +
  • XSLT objects now support deep copying
  • +
  • New makeSubElement() C-API function that allows creating a new +subelement straight with text, tail and attributes.
  • +
  • XPath extension functions can now access the current context node +(context.context_node) and use a context dictionary +(context.eval_context) from the context provided in their first +parameter
  • +
  • HTML tag soup parser based on BeautifulSoup in lxml.html.ElementSoup
  • +
  • New module lxml.doctestcompare by Ian Bicking for writing simplified +doctests based on XML/HTML output. Use by importing lxml.usedoctest or +lxml.html.usedoctest from within a doctest.
  • +
  • New module lxml.cssselect by Ian Bicking for selecting Elements with CSS +selectors.
  • +
  • New package lxml.html written by Ian Bicking for advanced HTML +treatment.
  • +
  • Namespace class setup is now local to the ElementNamespaceClassLookup +instance and no longer global.
  • +
  • Schematron validation (incomplete in libxml2)
  • +
  • Additional stringify argument to objectify.PyType() takes a +conversion function to strings to support setting text values from arbitrary +types.
  • +
  • Entity support through an Entity factory and element classes. XML +parsers now have a resolve_entities keyword argument that can be set to +False to keep entities in the document.
  • +
  • column field on error log entries to accompany the line field
  • +
  • Error specific messages in XPath parsing and evaluation +NOTE: for evaluation errors, you will now get an XPathEvalError instead of +an XPathSyntaxError. To catch both, you can except on XPathError
  • +
  • The regular expression functions in XPath now support passing a node-set +instead of a string
  • +
  • Extended type annotation in objectify: new xsiannotate() function
  • +
  • EXSLT RegExp support in standard XPath (not only XSLT)
  • +
+
+
+

Bugs fixed

+
    +
  • Missing import in lxml.html.clean.
  • +
  • Some Python 2.4-isms prevented lxml from building/running under +Python 2.3.
  • +
  • XPath on ElementTrees could crash when selecting the virtual root +node of the ElementTree.
  • +
  • Compilation --without-threading was buggy in alpha5/6.
  • +
  • Memory leak in the parse() function.
  • +
  • Minor bugs in XSLT error message formatting.
  • +
  • Result document memory leak in target parser.
  • +
  • Target parser failed to report comments.
  • +
  • In the lxml.html iter_links method, links in <object> +tags weren't recognized. (Note: plugin-specific link parameters +still aren't recognized.) Also, the <embed> tag, though not +standard, is now included in lxml.html.defs.special_inline_tags.
  • +
  • Using custom resolvers on XSLT stylesheets parsed from a string +could request ill-formed URLs.
  • +
  • With lxml.doctestcompare if you do <tag xmlns="..."> in your +output, it will then be namespace-neutral (before the ellipsis was +treated as a real namespace).
  • +
  • AttributeError in feed parser on parse errors
  • +
  • XML feed parser setup problem
  • +
  • Type annotation for unicode strings in DataElement()
  • +
  • lxml failed to serialise namespace declarations of elements other than the +root node of a tree
  • +
  • Race condition in XSLT where the resolver context leaked between concurrent +XSLT calls
  • +
  • lxml.etree did not check tag/attribute names
  • +
  • The XML parser did not report undefined entities as error
  • +
  • The text in exceptions raised by XML parsers, validators and XPath +evaluators now reports the first error that occurred instead of the last
  • +
  • Passing '' as XPath namespace prefix did not raise an error
  • +
  • Thread safety in XPath evaluators
  • +
+
+
+

Other changes

+
    +
  • Exceptions carry only the part of the error log that is related to +the operation that caused the error.
  • +
  • XMLSchema() and RelaxNG() now enforce passing the source +file/filename through the file keyword argument.
  • +
  • The test suite now skips most doctests under Python 2.3.
  • +
  • make clean no longer removes the .c files (use make +realclean instead)
  • +
  • Minor performance tweaks for Element instantiation and subelement +creation
  • +
  • Various places in the XPath, XSLT and iteration APIs now require +keyword-only arguments.
  • +
  • The argument order in element.itersiblings() was changed to +match the order used in all other iteration methods. The second +argument ('preceding') is now a keyword-only argument.
  • +
  • The getiterator() method on Elements and ElementTrees was +reverted to return an iterator as it did in lxml 1.x. The ET API +specification allows it to return either a sequence or an iterator, +and it traditionally returned a sequence in ET and an iterator in +lxml. However, it is now deprecated in favour of the iter() +method, which should be used in new code wherever possible.
  • +
  • The 'pretty printed' serialisation of ElementTree objects now +inserts newlines at the root level between processing instructions, +comments and the root tag.
  • +
  • A 'pretty printed' serialisation is now terminated with a newline.
  • +
  • Second argument to lxml.etree.Extension() helper is no longer +required, third argument is now a keyword-only argument ns.
  • +
  • lxml.html.tostring takes an encoding argument.
  • +
  • The module source files were renamed to "lxml.*.pyx", such as +"lxml.etree.pyx". This was changed for consistency with the way +Pyrex commonly handles package imports. The main effect is that +classes now know about their fully qualified class name, including +the package name of their module.
  • +
  • Keyword-only arguments in some API functions, especially in the +parsers and serialisers.
  • +
  • Tag name validation in lxml.etree (and lxml.html) now distinguishes +between HTML tags and XML tags based on the parser that was used to +parse or create them. HTML tags no longer reject any non-ASCII +characters in tag names but only spaces and the special characters +<>&/"'.
  • +
  • lxml.etree now emits a warning if you use XPath with libxml2 2.6.27 +(which can crash on certain XPath errors)
  • +
  • Type annotation in objectify now preserves the already annotated type by +default to prevent losing type information that is already there.
  • +
  • element.getiterator() returns a list, use element.iter() to retrieve +an iterator (ElementTree 1.3 compatible behaviour)
  • +
  • objectify.PyType for None is now called "NoneType"
  • +
  • el.getiterator() renamed to el.iter(), following ElementTree 1.3 - +original name is still available as alias
  • +
  • In the public C-API, findOrBuildNodeNs() was replaced by the more +generic findOrBuildNodeNsPrefix
  • +
  • Major refactoring in XPath/XSLT extension function code
  • +
  • Network access in parsers disabled by default
  • +
+
+
+
+

1.3.6 (2007-10-29)

+
+

Bugs fixed

+
    +
  • Backported decref crash fix from 2.0
  • +
  • Well hidden free-while-in-use crash bug in ObjectPath
  • +
+
+
+

Other changes

+
    +
  • The test suites now run gc.collect() in the tearDown() +methods. While this makes them take a lot longer to run, it also +makes it easier to link a specific test to garbage collection +problems that would otherwise appear in later tests.
  • +
+
+
+
+

1.3.5 (2007-10-22)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • lxml.etree could crash when adding more than 10000 namespaces to a +document
  • +
  • lxml failed to serialise namespace declarations of elements other +than the root node of a tree
  • +
+
+
+
+

1.3.4 (2007-08-30)

+
+

Features added

+
    +
  • The ElementMaker in lxml.builder now accepts the keyword arguments +namespace and nsmap to set a namespace and nsmap for the Elements it +creates.
  • +
  • The docinfo on ElementTree objects has new properties internalDTD +and externalDTD that return a DTD object for the internal or external +subset of the document respectively.
  • +
  • Serialising an ElementTree now includes any internal DTD subsets that are +part of the document, as well as comments and PIs that are siblings of the +root node.
  • +
+
+
+

Bugs fixed

+
    +
  • Parsing with the no_network option could fail
  • +
+
+
+

Other changes

+
    +
  • lxml now raises a TagNameWarning about tag names containing ':' instead of +an Error as 1.3.3 did. The reason is that a number of projects currently +misuse the previous lack of tag name validation to generate namespace +prefixes without declaring namespaces. Apart from the danger of generating +broken XML this way, it also breaks most of the namespace-aware tools in +XML, including XPath, XSLT and validation. lxml 1.3.x will continue to +support this bug with a Warning, while lxml 2.0 will be strict about +well-formed tag names (not only regarding ':').
  • +
  • Serialising an Element no longer includes its comment and PI siblings (only +ElementTree serialisation includes them).
  • +
+
+
+
+

1.3.3 (2007-07-26)

+
+

Features added

+
    +
  • ElementTree compatible parser ETCompatXMLParser strips processing +instructions and comments while parsing XML
  • +
  • Parsers now support stripping PIs (keyword argument 'remove_pis')
  • +
  • etree.fromstring() now supports parsing both HTML and XML, depending on +the parser you pass.
  • +
  • Support base_url keyword argument in HTML() and XML()
  • +
+
+
+

Bugs fixed

+
    +
  • Parsing from Python Unicode strings failed on some platforms
  • +
  • Element() did not raise an exception on tag names containing ':'
  • +
  • Element.getiterator(tag) did not accept Comment and +ProcessingInstruction as tags. It also accepts Element now.
  • +
+
+
+
+

1.3.2 (2007-07-03)

+
+

Features added

+
+
+

Bugs fixed

+
    +
  • "deallocating None" crash bug
  • +
+
+
+
+

1.3.1 (2007-07-02)

+
+

Features added

+
    +
  • objectify.DataElement now supports setting values from existing data +elements (not just plain Python types) and reuses defined namespaces etc.
  • +
  • E-factory support for lxml.objectify (objectify.E)
  • +
+
+
+

Bugs fixed

+
    +
  • Better way to prevent crashes in Element proxy cleanup code
  • +
  • objectify.DataElement didn't set up None value correctly
  • +
  • objectify.DataElement didn't check the value against the provided type hints
  • +
  • Reference-counting bug in Element.attrib.pop()
  • +
+
+
+
+

1.3 (2007-06-24)

+
+

Features added

+
    +
  • Module lxml.pyclasslookup module implements an Element class lookup +scheme that can access the entire tree in read-only mode to help determining +a suitable Element class
  • +
  • Parsers take a remove_comments keyword argument that skips over comments
  • +
  • parse() function in objectify, corresponding to XML() etc.
  • +
  • Element.addnext(el) and Element.addprevious(el) methods to support +adding processing instructions and comments around the root node
  • +
  • Element.attrib was missing clear() and pop() methods
  • +
  • Extended type annotation in objectify: cleaner annotation namespace setup +plus new deannotate() function
  • +
  • Support for custom Element class instantiation in lxml.sax: passing a +makeelement function to the ElementTreeContentHandler will reuse the +lookup context of that function
  • +
  • '.' represents empty ObjectPath (identity)
  • +
  • Element.values() to accompany the existing .keys() and .items()
  • +
  • collectAttributes() C-function to build a list of attribute +keys/values/items for a libxml2 node
  • +
  • DTD validator class (like RelaxNG and XMLSchema)
  • +
  • HTML generator helpers by Fredrik Lundh in lxml.htmlbuilder
  • +
  • ElementMaker XML generator by Fredrik Lundh in lxml.builder.E
  • +
  • Support for pickling objectify.ObjectifiedElement objects to XML
  • +
  • update() method on Element.attrib
  • +
  • Optimised replacement for libxml2's _xmlReconsiliateNs(). This allows lxml +a better handling of namespaces when moving elements between documents.
  • +
+
+
+

Bugs fixed

+
    +
  • Removing Elements from a tree could make them lose their namespace +declarations
  • +
  • ElementInclude didn't honour base URL of original document
  • +
  • Replacing the children slice of an Element would cut off the tails of the +original children
  • +
  • Element.getiterator(tag) did not accept Comment and +ProcessingInstruction as tags
  • +
  • API functions now check incoming strings for XML conformity. Zero bytes or +low ASCII characters are no longer accepted (AssertionError).
  • +
  • XSLT parsing failed to pass resolver context on to imported documents
  • +
  • passing '' as namespace prefix in nsmap could be passed through to libxml2
  • +
  • Objectify couldn't handle prefixed XSD type names in xsi:type
  • +
  • More ET compatible behaviour when writing out XML declarations or not
  • +
  • More robust error handling in iterparse()
  • +
  • Documents lost their top-level PIs and comments on serialisation
  • +
  • lxml.sax failed on comments and PIs. Comments are now properly ignored and +PIs are copied.
  • +
  • Possible memory leaks in namespace handling when moving elements between +documents
  • +
+
+
+

Other changes

+
    +
  • major restructuring in the documentation
  • +
+
+
+
+

1.2.1 (2007-02-27)

+
+

Bugs fixed

+
    +
  • Build fixes for MS compiler
  • +
  • Item assignments to special names like element["text"] failed
  • +
  • Renamed ObjectifiedDataElement.__setText() to _setText() to make it easier +to access
  • +
  • The pattern for attribute names in ObjectPath was too restrictive
  • +
+
+
+
+

1.2 (2007-02-20)

+
+

Features added

+
    +
  • Rich comparison of QName objects
  • +
  • Support for regular expressions in benchmark selection
  • +
  • get/set emulation (not .attrib!) for attributes on processing instructions
  • +
  • ElementInclude Python module for ElementTree compatible XInclude processing +that honours custom resolvers registered with the source document
  • +
  • ElementTree.parser property holds the parser used to parse the document
  • +
  • setup.py has been refactored for greater readability and flexibility
  • +
  • --rpath flag to setup.py to induce automatic linking-in of dynamic library +runtime search paths has been renamed to --auto-rpath. This makes it +possible to pass an --rpath directly to distutils; previously this was being +shadowed.
  • +
+
+
+

Bugs fixed

+
    +
  • Element instantiation now uses locks to prevent race conditions with threads
  • +
  • ElementTree.write() did not raise an exception when the file was not writable
  • +
  • Error handling could crash under Python <= 2.4.1 - fixed by disabling thread +support in these environments
  • +
  • Element.find*() did not accept QName objects as path
  • +
+
+
+

Other changes

+
    +
  • code cleanup: redundant _NodeBase super class merged into _Element class +Note: although the impact should be zero in most cases, this change breaks +the compatibility of the public C-API
  • +
+
+
+
+

1.1.2 (2006-10-30)

+
+

Features added

+
    +
  • Data elements in objectify support repr(), which is now used by dump()
  • +
  • Source distribution now ships with a patched Pyrex
  • +
  • New C-API function makeElement() to create new elements with text, +tail, attributes and namespaces
  • +
  • Reuse original parser flags for XInclude
  • +
  • Simplified support for handling XSLT processing instructions
  • +
+
+
+

Bugs fixed

+
    +
  • Parser resources were not freed before the next parser run
  • +
  • Open files and XML strings returned by Python resolvers were not +closed/freed
  • +
  • Crash in the IDDict returned by XMLDTDID
  • +
  • Copying Comments and ProcessingInstructions failed
  • +
  • Memory leak for external URLs in _XSLTProcessingInstruction.parseXSL()
  • +
  • Memory leak when garbage collecting tailed root elements
  • +
  • HTML script/style content was not propagated to .text
  • +
  • Show text xincluded between text nodes correctly in .text and .tail
  • +
  • 'integer * objectify.StringElement' operation was not supported
  • +
+
+
+
+

1.1.1 (2006-09-21)

+
+

Features added

+
    +
  • XSLT profiling support (profile_run keyword)
  • +
  • countchildren() method on objectify.ObjectifiedElement
  • +
  • Support custom elements for tree nodes in lxml.objectify
  • +
+
+
+

Bugs fixed

+
    +
  • lxml.objectify failed to support long data values (e.g., "123L")
  • +
  • Error messages from XSLT did not reach XSLT.error_log
  • +
  • Factories objectify.Element() and objectify.DataElement() were missing +attrib and nsmap keyword arguments
  • +
  • Changing the default parser in lxml.objectify did not update the factories +Element() and DataElement()
  • +
  • Let lxml.objectify.Element() always generate tree elements (not data +elements)
  • +
  • Build under Windows failed ('0' bug in patched Pyrex version)
  • +
+
+
+
+

1.1 (2006-09-13)

+
+

Features added

+
    +
  • Comments and processing instructions return '<!-- comment -->' and +'<?pi-target content?>' for repr()
  • +
  • Parsers are now the preferred (and default) place where element class lookup +schemes should be registered. Namespace lookup is no longer supported by +default.
  • +
  • Support for Python 2.5 beta
  • +
  • Unlock the GIL for deep copying documents and for XPath()
  • +
  • New compact keyword argument for parsing read-only documents
  • +
  • Support for parser options in iterparse()
  • +
  • The namespace axis is supported in XPath and returns (prefix, URI) +tuples
  • +
  • The XPath expression "/" now returns an empty list instead of raising an +exception
  • +
  • XML-Object API on top of lxml (lxml.objectify)
  • +
  • Customizable Element class lookup:
      +
    • different pre-implemented lookup mechanisms
    • +
    • support for externally provided lookup functions
    • +
    +
  • +
  • Support for processing instructions (ET-like, not compatible)
  • +
  • Public C-level API for independent extension modules
  • +
  • Module level iterwalk() function as 'iterparse' for trees
  • +
  • Module level iterparse() function similar to ElementTree (see +documentation for differences)
  • +
  • Element.nsmap property returns a mapping of all namespace prefixes known at +the Element to their namespace URI
  • +
  • Reentrant threading support in RelaxNG, XMLSchema and XSLT
  • +
  • Threading support in parsers and serializers:
      +
    • All in-memory operations (tostring, parse(StringIO), etc.) free the GIL
    • +
    • File operations (on file names) free the GIL
    • +
    • Reading from file-like objects frees the GIL and reacquires it for reading
    • +
    • Serialisation to file-like objects is single-threaded (high lock overhead)
    • +
    +
  • +
  • Element iteration over XPath axes:
      +
    • Element.iterdescendants() iterates over the descendants of an element
    • +
    • Element.iterancestors() iterates over the ancestors of an element (from +parent to parent)
    • +
    • Element.itersiblings() iterates over either the following or preceding +siblings of an element
    • +
    • Element.iterchildren() iterates over the children of an element in either +direction
    • +
    • All iterators support the tag keyword argument to restrict the +generated elements
    • +
    +
  • +
  • Element.getnext() and Element.getprevious() return the direct siblings of an +element
  • +
+
+
+

Bugs fixed

+
    +
  • filenames with local 8-bit encoding were not supported
  • +
  • 1.1beta did not compile under Python 2.3
  • +
  • ignore unknown 'pyval' attribute values in objectify
  • +
  • objectify.ObjectifiedElement.addattr() failed to accept Elements and Lists
  • +
  • objectify.ObjectPath.setattr() failed to accept Elements and Lists
  • +
  • XPathSyntaxError now inherits from XPathError
  • +
  • Threading race conditions in RelaxNG and XMLSchema
  • +
  • Crash when mixing elements from XSLT results into other trees, concurrent +XSLT is only allowed when the stylesheet was parsed in the main thread
  • +
  • The EXSLT regexp:match function now works as defined (except for some +differences in the regular expression syntax)
  • +
  • Setting element.text to '' returned None on request, not the empty string
  • +
  • iterparse() could crash on long XML files
  • +
  • Creating documents no longer copies the parser for later URL resolving. For +performance reasons, only a reference is kept. Resolver updates on the +parser will now be reflected by documents that were parsed before the +change. Although this should rarely become visible, it is a behavioral +change from 1.0.
  • +
+
+
+
+

1.0.4 (2006-09-09)

+
+

Features added

+
    +
  • List-like Element.extend() method
  • +
+
+
+

Bugs fixed

+
    +
  • Crash in tail handling in Element.replace()
  • +
+
+
+
+

1.0.3 (2006-08-08)

+
+

Features added

+
    +
  • Element.replace(old, new) method to replace a subelement by another one
  • +
+
+
+

Bugs fixed

+
    +
  • Crash when mixing elements from XSLT results into other trees
  • +
  • Copying/deepcopying did not work for ElementTree objects
  • +
  • Setting an attribute to a non-string value did not raise an exception
  • +
  • Element.remove() deleted the tail text from the removed Element
  • +
+
+
+
+

1.0.2 (2006-06-27)

+
+

Features added

+
    +
  • Support for setting a custom default Element class as opposed to namespace +specific classes (which still override the default class)
  • +
+
+
+

Bugs fixed

+
    +
  • Rare exceptions in Python list functions were not handled
  • +
  • Parsing accepted unicode strings with XML encoding declaration in certain +cases
  • +
  • Parsing 8-bit encoded strings from StringIO objects raised an exception
  • +
  • Module function initThread() was removed - useless (and never worked)
  • +
  • XSLT and parser exception messages include the error line number
  • +
+
+
+
+

1.0.1 (2006-06-09)

+
+

Features added

+
    +
  • Repeated calls to Element.attrib now efficiently return the same instance
  • +
+
+
+

Bugs fixed

+
    +
  • Document deallocation could crash in certain garbage collection scenarios
  • +
  • Extension function calls in XSLT variable declarations could break the +stylesheet and crash on repeated calls
  • +
  • Deep copying Elements could lose namespaces declared in parents
  • +
  • Deep copying Elements did not copy tail
  • +
  • Parsing file(-like) objects failed to load external entities
  • +
  • Parsing 8-bit strings from file(-like) objects raised an exception
  • +
  • xsl:include failed when the stylesheet was parsed from a file-like object
  • +
  • lxml.sax.ElementTreeProducer did not call startDocument() / endDocument()
  • +
  • MSVC compiler complained about long strings (supports only 2048 bytes)
  • +
+
+
+
+

1.0 (2006-06-01)

+
+

Features added

+
    +
  • Element.getiterator() and the findall() methods support finding arbitrary +elements from a namespace (pattern {namespace}*)
  • +
  • Another speedup in tree iteration code
  • +
  • General speedup of Python Element object creation and deallocation
  • +
  • Writing C14N no longer serializes in memory (reduced memory footprint)
  • +
  • PyErrorLog for error logging through the Python logging module
  • +
  • Element.getroottree() returns an ElementTree for the root node of the +document that contains the element.
  • +
  • ElementTree.getpath(element) returns a simple, absolute XPath expression to +find the element in the tree structure
  • +
  • Error logs have a last_error attribute for convenience
  • +
  • Comment texts can be changed through the API
  • +
  • Formatted output via pretty_print keyword in serialization functions
  • +
  • XSLT can block access to file system and network via XSLTAccessControl
  • +
  • ElementTree.write() no longer serializes in memory (reduced memory +footprint)
  • +
  • Speedup of Element.findall(tag) and Element.getiterator(tag)
  • +
  • Support for writing the XML representation of Elements and ElementTrees to +Python unicode strings via etree.tounicode()
  • +
  • Support for writing XSLT results to Python unicode strings via unicode()
  • +
  • Parsing a unicode string no longer copies the string (reduced memory +footprint)
  • +
  • Parsing file-like objects reads chunks rather than the whole file (reduced +memory footprint)
  • +
  • Parsing StringIO objects from the start avoids copying the string (reduced +memory footprint)
  • +
  • Read-only 'docinfo' attribute in ElementTree class holds DOCTYPE +information, original encoding and XML version as seen by the parser
  • +
  • etree module can be compiled without libxslt by commenting out the line +include "xslt.pxi" near the end of the etree.pyx source file
  • +
  • Better error messages in parser exceptions
  • +
  • Error reporting also works in XSLT
  • +
  • Support for custom document loaders (URI resolvers) in parsers and XSLT, +resolvers are registered at parser level
  • +
  • Implementation of exslt:regexp for XSLT based on the Python 're' module, +enabled by default, can be switched off with 'regexp=False' keyword argument
  • +
  • Support for exslt extensions (libexslt) and libxslt extra functions +(node-set, document, write, output)
  • +
  • Substantial speedup in XPath.evaluate()
  • +
  • HTMLParser for parsing (broken) HTML
  • +
  • XMLDTDID function parses XML into tuple (root node, ID dict) based on xml:id +implementation of libxml2 (as opposed to ET compatible XMLID)
  • +
+
+
+

Bugs fixed

+
    +
  • Memory leak in Element.__setitem__
  • +
  • Memory leak in Element.attrib.items() and Element.attrib.values()
  • +
  • Memory leak in XPath extension functions
  • +
  • Memory leak in unicode related setup code
  • +
  • Element now raises ValueError on empty tag names
  • +
  • Namespace fixing after moving elements between documents could fail if the +source document was freed too early
  • +
  • Setting namespace-less tag names on namespaced elements ('{ns}t' -> 't') +didn't reset the namespace
  • +
  • Unknown constants from newer libxml2 versions could raise exceptions in the +error handlers
  • +
  • lxml.etree compiles much faster
  • +
  • On libxml2 <= 2.6.22, parsing strings with encoding declaration could fail +in certain cases
  • +
  • Document reference in ElementTree objects was not updated when the root +element was moved to a different document
  • +
  • Running absolute XPath expressions on an Element now evaluates against the +root tree
  • +
  • Evaluating absolute XPath expressions (/*) on an ElementTree could fail
  • +
  • Crashes when calling XSLT, RelaxNG, etc. with uninitialized ElementTree +objects
  • +
  • Removed public function initThreadLogging(), replaced by more general +initThread() which fixes a number of setup problems in threads
  • +
  • Memory leak when using iconv encoders in tostring/write
  • +
  • Deep copying Elements and ElementTrees maintains the document information
  • +
  • Serialization functions raise LookupError for unknown encodings
  • +
  • Memory deallocation crash resulting from deep copying elements
  • +
  • Some ElementTree methods could crash if the root node was not initialized +(neither file nor element passed to the constructor)
  • +
  • Element/SubElement failed to set attribute namespaces from passed attrib +dictionary
  • +
  • tostring() adds an XML declaration for non-ASCII encodings
  • +
  • tostring() failed to serialize encodings that contain 0-bytes
  • +
  • ElementTree.xpath() and XPathDocumentEvaluator were not using the +ElementTree root node as reference point
  • +
  • Calling document('') in XSLT failed to return the stylesheet
  • +
+
+
+
+

0.9.2 (2006-05-10)

+
+

Features added

+
    +
  • Speedup for Element.makeelement(): the new element reuses the original +libxml2 document instead of creating a new empty one
  • +
  • Speedup for reversed() iteration over element children (Py2.4+ only)
  • +
  • ElementTree compatible QName class
  • +
  • RelaxNG and XMLSchema accept any Element, not only ElementTrees
  • +
+
+
+

Bugs fixed

+
    +
  • str(xslt_result) was broken for XSLT output other than UTF-8
  • +
  • Memory leak if write_c14n fails to write the file after conversion
  • +
  • Crash in XMLSchema and RelaxNG when passing non-schema documents
  • +
  • Memory leak in RelaxNG() when RelaxNGParseError is raised
  • +
+
+
+
+

0.9.1 (2006-03-30)

+
+

Features added

+
    +
  • lxml.sax.ElementTreeContentHandler checks closing elements and raises +SaxError on mismatch
  • +
  • lxml.sax.ElementTreeContentHandler supports namespace-less SAX events +(startElement, endElement) and defaults to empty attributes (keyword +argument)
  • +
  • Speedup for repeatedly accessing element tag names
  • +
  • Minor API performance improvements
  • +
+
+
+

Bugs fixed

+
    +
  • Memory deallocation bug when using XSLT output method "html"
  • +
  • sax.py was handling UTF-8 encoded tag names where it shouldn't
  • +
  • lxml.tests package will no longer be installed (is still in source tar)
  • +
+
+
+
+

0.9 (2006-03-20)

+
+

Features added

+
    +
  • Error logging API for libxml2 error messages
  • +
  • Various performance improvements
  • +
  • Benchmark script for lxml, ElementTree and cElementTree
  • +
  • Support for registering extension functions through new FunctionNamespace +class (see doc/extensions.txt)
  • +
  • ETXPath class for XPath expressions in ElementTree notation ('//{ns}tag')
  • +
  • Support for variables in XPath expressions (also in XPath class)
  • +
  • XPath class for compiled XPath expressions
  • +
  • XMLID module level function (ElementTree compatible)
  • +
  • XMLParser API for customized libxml2 parser configuration
  • +
  • Support for custom Element classes through new Namespace API (see +doc/namespace_extensions.txt)
  • +
  • Common exception base class LxmlError for module exceptions
  • +
  • real iterator support in iter(Element), Element.getiterator()
  • +
  • XSLT objects are callable, result trees support str()
  • +
  • Added MANIFEST.in for easier creation of RPM files.
  • +
  • 'getparent' method on elements allows navigation to an element's +parent element.
  • +
  • Python core compatible SAX tree builder and SAX event generator. See +doc/sax.txt for more information.
  • +
+
+
+

Bugs fixed

+
    +
  • Segfaults and memory leaks in various API functions of Element
  • +
  • Segfault in XSLT.tostring()
  • +
  • ElementTree objects no longer interfere, Elements can be root of different +ElementTrees at the same time
  • +
  • document('') works in XSLT documents read from files (in-memory documents +cannot support this due to libxslt deficiencies)
  • +
+
+
+
+

0.8 (2005-11-03)

+
+

Features added

+
    +
  • Support for copy.deepcopy() on elements. copy.copy() works also, but +does the same thing, and does not create a shallow copy, as that +makes no sense in the context of libxml2 trees. This means a +potential incompatibility with ElementTree, but there's more chance +that it works than if copy.copy() isn't supported at all.
  • +
  • Increased compatibility with (c)ElementTree; .parse() on ElementTree is +supported and parsing of gzipped XML files works.
  • +
  • implemented index() on elements, allowing one to find the index of a +SubElement.
  • +
+
+
+

Bugs fixed

+
    +
  • Use xslt-config instead of xml2-config to find out libxml2 +directories to take into account a case where libxslt is installed +in a different directory than libxslt.
  • +
  • Eliminate crash condition in iteration when text nodes are changed.
  • +
  • Passing 'None' to tostring() does not result in a segfault anymore, +but an AssertionError.
  • +
  • Some test fixes for Windows.
  • +
  • Raise XMLSyntaxError and XPathSyntaxError instead of plain python +syntax errors. This should be less confusing.
  • +
  • Fixed error with uncaught exception in Pyrex code.
  • +
  • Calling lxml.etree.fromstring('') throws XMLSyntaxError instead of a +segfault.
  • +
  • has_key() works on attrib. 'in' tests also work correctly on attrib.
  • +
  • INSTALL.txt was saying 2.2.16 instead of 2.6.16 as a supported +libxml2 version, as it should.
  • +
  • Passing a UTF-8 encoded string to the XML() function would fail; +fixed.
  • +
+
+
+
+

0.7 (2005-06-15)

+
+

Features added

+
    +
  • parameters (XPath expressions) can be passed to XSLT using keyword +parameters.
  • +
  • Simple XInclude support. Calling the xinclude() method on a tree +will process any XInclude statements in the document.
  • +
  • XMLSchema support. Use the XMLSchema class or the convenience +xmlschema() method on a tree to do XML Schema (XSD) validation.
  • +
  • Added convenience xslt() method on tree. This is less efficient +than the XSLT object, but makes it easier to write quick code.
  • +
  • Added convenience relaxng() method on tree. This is less efficient +than the RelaxNG object, but makes it easier to write quick code.
  • +
  • Make it possible to use XPathEvaluator with elements as well. The +XPathEvaluator in this case will retain the element so multiple +XPath queries can be made against one element efficiently. This +replaces the second argument to the .evaluate() method that existed +previously.
  • +
  • Allow registerNamespace() to be called on an XPathEvaluator, after +creation, to add additional namespaces. Also allow registerNamespaces(), +which does the same for a namespace dictionary.
  • +
  • Add 'prefix' attribute to element to be able to read prefix information. +This is entirely read-only.
  • +
  • It is possible to supply an extra nsmap keyword parameter to +the Element() and SubElement() constructors, which supplies a +prefix to namespace URI mapping. This will create namespace +prefix declarations on these elements and these prefixes will show up +in XML serialization.
  • +
+
+
+

Bugs fixed

+
    +
  • Killed yet another memory management related bug: trees created +using newDoc would not get a libxml2-level dictionary, which caused +problems when deallocating these documents later if they contained a +node that came from a document with a dictionary.
  • +
  • Moving namespaced elements between documents was problematic as +references to the original document would remain. This has been fixed +by applying xmlReconciliateNs() after each move operation.
  • +
  • Can pass None to 'dump()' without segfaults.
  • +
  • tostring() works properly for non-root elements as well.
  • +
  • Cleaned out the tostring() method so it should handle encoding +correctly.
  • +
  • Cleaned out the ElementTree.write() method so it should handle encoding +correctly. Writing directly to a file should also be faster, as there is no +need to go through a Python string in that case. Made sure the test cases +test both serializing to StringIO as well as serializing to a real file.
  • +
+
+
+
+

0.6 (2005-05-14)

+
+

Features added

+
    +
  • Changed setup.py so that library_dirs is also guessed. This should +help with compilation on the Mac OS X platform, where otherwise the +wrong library (shipping with the OS) could be picked up.
  • +
  • Tweaked setup.py so that it picks up the version from version.txt.
  • +
+
+
+

Bugs fixed

+
    +
  • Do the right thing when handling namespaced attributes.
  • +
  • fix bug where tostring() moved nodes into new documents. tostring() +had very nasty side-effects before this fix, sorry!
  • +
+
+
+
+

0.5.1 (2005-04-09)

+
    +
  • Python 2.2 compatibility fixes.
  • +
  • unicode fixes in Element() and Comment() as well as XML(); unicode +input wasn't properly being UTF-8 encoded.
  • +
+
+
+

0.5 (2005-04-08)

+

Initial public release.

+
+
+ + + diff --git a/doc/html/compatibility.html b/doc/html/compatibility.html index c01f071b..10e1dcb7 100644 --- a/doc/html/compatibility.html +++ b/doc/html/compatibility.html @@ -24,7 +24,7 @@ function hide_menu() {
-

ElementTree compatibility of lxml.etree

+

ElementTree compatibility of lxml.etree

A lot of care has been taken to ensure compatibility between etree and ElementTree. Nonetheless, some differences and incompatibilities exist:

@@ -199,7 +199,7 @@ enough to replace a shallow copy in your case.

diff --git a/doc/html/credits.html b/doc/html/credits.html index 7421953b..2ef05fa5 100644 --- a/doc/html/credits.html +++ b/doc/html/credits.html @@ -24,7 +24,7 @@ function hide_menu() {
-

Credits

+

Credits

Main contributors

@@ -88,7 +88,7 @@ Holger Krekel for originally hosting lxml on codespeak.net
diff --git a/doc/html/cssselect.html b/doc/html/cssselect.html index e8238cd2..e79ee893 100644 --- a/doc/html/cssselect.html +++ b/doc/html/cssselect.html @@ -24,7 +24,7 @@ function hide_menu() {
-

lxml.cssselect

+

lxml.cssselect

lxml supports a number of interesting languages for tree traversal and element selection. The most important is obviously XPath, but there is also @@ -113,7 +113,7 @@ namespace URIs: the CSSSelector class accepts

diff --git a/doc/html/element_classes.html b/doc/html/element_classes.html index 0e8616b9..7a0a3252 100644 --- a/doc/html/element_classes.html +++ b/doc/html/element_classes.html @@ -24,7 +24,7 @@ function hide_menu() {
-

Using custom Element classes in lxml

+

Using custom Element classes in lxml

lxml has very sophisticated support for custom Element classes. You can provide your own classes for Elements and have lxml use them by @@ -525,7 +525,7 @@ and use the blank decorator instead:

diff --git a/doc/html/elementsoup.html b/doc/html/elementsoup.html index 5d05af72..305c332e 100644 --- a/doc/html/elementsoup.html +++ b/doc/html/elementsoup.html @@ -24,7 +24,7 @@ function hide_menu() {
-

BeautifulSoup Parser

+

BeautifulSoup Parser

BeautifulSoup is a Python package for working with real-world and broken HTML, just like lxml.html. As of version 4.x, it can use @@ -203,7 +203,7 @@ you can simply pass the resulting Unicode string into lxml's parser.

diff --git a/doc/html/extensions.html b/doc/html/extensions.html index 84c1543b..2a36dad5 100644 --- a/doc/html/extensions.html +++ b/doc/html/extensions.html @@ -24,7 +24,7 @@ function hide_menu() {
-

Python extensions for XPath and XSLT

+

Python extensions for XPath and XSLT

This document describes how to use Python extension functions in XPath and XSLT like this:

@@ -530,7 +530,7 @@ will work:

diff --git a/doc/html/html5parser.html b/doc/html/html5parser.html index 67ed3029..c3deacba 100644 --- a/doc/html/html5parser.html +++ b/doc/html/html5parser.html @@ -24,7 +24,7 @@ function hide_menu() {
-

html5lib Parser

+

html5lib Parser

html5lib is a Python package that implements the HTML5 parsing algorithm which is heavily influenced by current browsers and based on the WHATWG @@ -90,7 +90,7 @@ module. Note that these are the parser classes provided by html5lib.

diff --git a/doc/html/index.html b/doc/html/index.html index f644b29f..b8c0c7a8 100644 --- a/doc/html/index.html +++ b/doc/html/index.html @@ -26,7 +26,7 @@ function hide_menu() {
-

lxml - XML and HTML with Python

+

lxml - XML and HTML with Python

@@ -72,7 +72,7 @@ Jetbrains supports the lxml project by donating free licenses of their

Documentation

-

The complete lxml documentation is available for download as PDF +

The complete lxml documentation is available for download as PDF documentation. The HTML documentation from this web site is part of the normal source download.

diff --git a/doc/html/installation.html b/doc/html/installation.html index ccc7b7da..6f78bc97 100644 --- a/doc/html/installation.html +++ b/doc/html/installation.html @@ -24,7 +24,7 @@ function hide_menu() {
-

Installing lxml

+

Installing lxml

Contents

@@ -208,7 +208,7 @@ read the
diff --git a/doc/html/intro.html b/doc/html/intro.html index 38db6107..2396d29b 100644 --- a/doc/html/intro.html +++ b/doc/html/intro.html @@ -24,7 +24,7 @@ function hide_menu() {
-

Why lxml?

+

Why lxml?

Contents

@@ -82,7 +82,7 @@ having to learn new things -- XML is complicated enough.

diff --git a/doc/html/lxml-source-howto.html b/doc/html/lxml-source-howto.html index 60d2f52b..4245330d 100644 --- a/doc/html/lxml-source-howto.html +++ b/doc/html/lxml-source-howto.html @@ -27,7 +27,7 @@ function hide_menu() {
-

How to read the source of lxml

+

How to read the source of lxml

@@ -286,7 +286,7 @@ implemented in pure Python.

diff --git a/doc/html/lxmlhtml.html b/doc/html/lxmlhtml.html index 17fc2ee7..48e484e0 100644 --- a/doc/html/lxmlhtml.html +++ b/doc/html/lxmlhtml.html @@ -25,7 +25,7 @@ function hide_menu() {
-

lxml.html

+

lxml.html

@@ -696,7 +696,7 @@ microformat.

diff --git a/doc/html/objectify.html b/doc/html/objectify.html index 9c791439..0ff759c0 100644 --- a/doc/html/objectify.html +++ b/doc/html/objectify.html @@ -25,7 +25,7 @@ function hide_menu() {
-

lxml.objectify

+

lxml.objectify

@@ -1165,7 +1165,7 @@ support any XPath expression. diff --git a/doc/html/parsing.html b/doc/html/parsing.html index 35269302..87d957e7 100644 --- a/doc/html/parsing.html +++ b/doc/html/parsing.html @@ -24,7 +24,7 @@ function hide_menu() {
-

Parsing XML and HTML with lxml

+

Parsing XML and HTML with lxml

lxml provides a very simple and powerful API for parsing XML and HTML. It supports one-step parsing as well as step-by-step parsing using an @@ -893,7 +893,7 @@ with UTF-8 is also considerably faster in most cases.

diff --git a/doc/html/performance.html b/doc/html/performance.html index a3ac32ee..7207f3ac 100644 --- a/doc/html/performance.html +++ b/doc/html/performance.html @@ -27,7 +27,7 @@ function hide_menu() {
-

Benchmarks and Speed

+

Benchmarks and Speed

@@ -798,7 +798,7 @@ random.

diff --git a/doc/html/resolvers.html b/doc/html/resolvers.html index 6b029ca1..5d641b08 100644 --- a/doc/html/resolvers.html +++ b/doc/html/resolvers.html @@ -24,7 +24,7 @@ function hide_menu() {
-

Document loading and URL resolving

+

Document loading and URL resolving

Contents

@@ -250,7 +250,7 @@ documents or raises exceptions if access is denied.
diff --git a/doc/html/sax.html b/doc/html/sax.html index 30c4bf9b..f1b414f5 100644 --- a/doc/html/sax.html +++ b/doc/html/sax.html @@ -24,7 +24,7 @@ function hide_menu() {
-

Sax support

+

Sax support

In this document we'll describe lxml's SAX support. lxml has support for producing SAX events for an ElementTree or Element. lxml can also turn SAX @@ -124,7 +124,7 @@ DOM implementation cannot generate SAX events from a DOM tree.

diff --git a/doc/html/sitemap.html b/doc/html/sitemap.html index 9d16604c..bcad53ca 100644 --- a/doc/html/sitemap.html +++ b/doc/html/sitemap.html @@ -8,5 +8,5 @@

Sitemap of lxml.de - Processing XML and HTML with Python

-
+
\ No newline at end of file diff --git a/doc/html/tutorial.html b/doc/html/tutorial.html index 6973861e..dc796d05 100644 --- a/doc/html/tutorial.html +++ b/doc/html/tutorial.html @@ -27,7 +27,7 @@ function hide_menu() {
-

The lxml.etree Tutorial

+

The lxml.etree Tutorial

@@ -1184,7 +1184,7 @@ whereas the other two examples would raise a StopIt diff --git a/doc/html/validation.html b/doc/html/validation.html index 840ddab5..069c6d5e 100644 --- a/doc/html/validation.html +++ b/doc/html/validation.html @@ -24,7 +24,7 @@ function hide_menu() {
-

Validation with lxml

+

Validation with lxml

Apart from the built-in DTD support in parsers, lxml currently supports three schema languages: DTD, Relax NG and XML Schema. All three provide @@ -556,7 +556,7 @@ reporting during validation.

diff --git a/doc/html/xpathxslt.html b/doc/html/xpathxslt.html index 345c6647..a2b725ec 100644 --- a/doc/html/xpathxslt.html +++ b/doc/html/xpathxslt.html @@ -24,7 +24,7 @@ function hide_menu() {
-

XPath and XSLT with lxml

+

XPath and XSLT with lxml

lxml supports XPath 1.0, XSLT 1.0 and the EXSLT extensions through libxml2 and libxslt in a standards compliant way.

@@ -632,7 +632,7 @@ If you want to free it from memory, just do:

diff --git a/doc/main.txt b/doc/main.txt index c3a8e464..6d208f48 100644 --- a/doc/main.txt +++ b/doc/main.txt @@ -157,8 +157,8 @@ Index `_ (PyPI). It has the source that compiles on various platforms. The source distribution is signed with `this key `_. -The latest version is `lxml 4.3.2`_, released 2019-02-29 -(`changes for 4.3.2`_). `Older versions <#old-versions>`_ +The latest version is `lxml 4.3.3`_, released 2019-03-26 +(`changes for 4.3.3`_). `Older versions <#old-versions>`_ are listed below. Please take a look at the @@ -251,7 +251,9 @@ See the websites of lxml .. and the `latest in-development version `_. -.. _`PDF documentation`: lxmldoc-4.3.2.pdf +.. _`PDF documentation`: lxmldoc-4.3.3.pdf + +* `lxml 4.3.3`_, released 2019-03-26 (`changes for 4.3.3`_) * `lxml 4.3.2`_, released 2019-02-29 (`changes for 4.3.2`_) @@ -283,6 +285,7 @@ See the websites of lxml * `older releases `_ +.. _`lxml 4.3.3`: /files/lxml-4.3.3.tgz .. _`lxml 4.3.2`: /files/lxml-4.3.2.tgz .. _`lxml 4.3.1`: /files/lxml-4.3.1.tgz .. _`lxml 4.3.0`: /files/lxml-4.3.0.tgz @@ -298,6 +301,7 @@ See the websites of lxml .. _`lxml 4.0.0`: /files/lxml-4.0.0.tgz .. _`lxml 3.8.0`: /files/lxml-3.8.0.tgz +.. _`changes for 4.3.3`: /changes-4.3.3.html .. _`changes for 4.3.2`: /changes-4.3.2.html .. _`changes for 4.3.1`: /changes-4.3.1.html .. _`changes for 4.3.0`: /changes-4.3.0.html diff --git a/src/lxml.egg-info/PKG-INFO b/src/lxml.egg-info/PKG-INFO index 0b90e606..e2d2efba 100644 --- a/src/lxml.egg-info/PKG-INFO +++ b/src/lxml.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: lxml -Version: 4.3.2 +Version: 4.3.3 Summary: Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. Home-page: http://lxml.de/ Author: lxml dev team @@ -38,18 +38,13 @@ Description: lxml is a Pythonic, mature binding for the libxml2 and libxslt libr as soon as a maintenance branch has been established. Note that this requires Cython to be installed at an appropriate version for the build. - 4.3.2 (2019-02-29) + 4.3.3 (2019-03-26) ================== Bugs fixed ---------- - * Crash in 4.3.1 when appending a child subtree with certain text nodes. - - Other changes - ------------- - - * Built with Cython 0.29.6. + * Fix leak of output buffer and unclosed files in ``_XSLTResultTree.write_output()``. diff --git a/src/lxml.egg-info/SOURCES.txt b/src/lxml.egg-info/SOURCES.txt index 940a9cea..d5b21284 100644 --- a/src/lxml.egg-info/SOURCES.txt +++ b/src/lxml.egg-info/SOURCES.txt @@ -56,7 +56,7 @@ doc/html/FAQ.html doc/html/api.html doc/html/build.html doc/html/capi.html -doc/html/changes-4.3.2.html +doc/html/changes-4.3.3.html doc/html/compatibility.html doc/html/credits.html doc/html/cssselect.html diff --git a/src/lxml/etree.c b/src/lxml/etree.c index 0ab54e84..59092479 100644 --- a/src/lxml/etree.c +++ b/src/lxml/etree.c @@ -3116,7 +3116,7 @@ struct __pyx_obj_4lxml_5etree__XSLTResultTree { }; -/* "src/lxml/xslt.pxi":895 +/* "src/lxml/xslt.pxi":890 * return __findStylesheetByID(doc, id=id) * * cdef class _XSLTProcessingInstruction(PIBase): # <<<<<<<<<<<<<< @@ -5119,7 +5119,7 @@ static struct __pyx_vtabstruct_4lxml_5etree__XSLTResultTree *__pyx_vtabptr_4lxml static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(struct __pyx_obj_4lxml_5etree__XSLTResultTree *, xmlChar **, int *); -/* "src/lxml/xslt.pxi":895 +/* "src/lxml/xslt.pxi":890 * return __findStylesheetByID(doc, id=id) * * cdef class _XSLTProcessingInstruction(PIBase): # <<<<<<<<<<<<<< @@ -7464,6 +7464,7 @@ static const char __pyx_k_parser[] = "parser"; static const char __pyx_k_path_2[] = "_path"; static const char __pyx_k_pcdata[] = "pcdata"; static const char __pyx_k_prefix[] = "prefix"; +static const char __pyx_k_rclose[] = "rclose"; static const char __pyx_k_regexp[] = "regexp"; static const char __pyx_k_remove[] = "remove"; static const char __pyx_k_result[] = "result"; @@ -7653,7 +7654,6 @@ static const char __pyx_k_enumerate[] = "enumerate"; static const char __pyx_k_error_log[] = "error_log"; static const char __pyx_k_evaluator[] = "evaluator"; static const char __pyx_k_exclusive[] = "exclusive"; -static const char __pyx_k_file_path[] = "file_path"; static const char __pyx_k_functions[] = "functions"; static const char __pyx_k_functools[] = "functools"; static const char __pyx_k_getLogger[] = "getLogger"; @@ -7707,7 +7707,6 @@ static const char __pyx_k_attributes[] = "attributes"; static const char __pyx_k_byte_count[] = "byte_count"; static const char __pyx_k_bytes_used[] = "bytes_used"; static const char __pyx_k_c_encoding[] = "c_encoding"; -static const char __pyx_k_c_filename[] = "c_filename"; static const char __pyx_k_c_new_next[] = "c_new_next"; static const char __pyx_k_c_new_node[] = "c_new_node"; static const char __pyx_k_c_old_next[] = "c_old_next"; @@ -9191,7 +9190,6 @@ static PyObject *__pyx_n_s_c_doc; static PyObject *__pyx_n_s_c_dtd; static PyObject *__pyx_n_s_c_element; static PyObject *__pyx_n_s_c_encoding; -static PyObject *__pyx_n_s_c_filename; static PyObject *__pyx_n_s_c_href; static PyObject *__pyx_n_s_c_method; static PyObject *__pyx_n_s_c_name; @@ -9360,7 +9358,6 @@ static PyObject *__pyx_n_s_feed; static PyObject *__pyx_n_s_feed_error_log; static PyObject *__pyx_n_s_file; static PyObject *__pyx_kp_u_file_must_be_a_filename_or_file; -static PyObject *__pyx_n_s_file_path; static PyObject *__pyx_n_s_filelike; static PyObject *__pyx_n_s_filename; static PyObject *__pyx_n_s_fileobj; @@ -9646,6 +9643,7 @@ static PyObject *__pyx_n_s_r; static PyObject *__pyx_n_s_raise_on_error; static PyObject *__pyx_n_s_range; static PyObject *__pyx_n_s_rb; +static PyObject *__pyx_n_s_rclose; static PyObject *__pyx_n_b_rdf; static PyObject *__pyx_n_s_re; static PyObject *__pyx_n_s_read; @@ -188081,11 +188079,10 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_write_output(struct __p struct __pyx_obj_4lxml_5etree__FilelikeWriter *__pyx_v_writer = 0; struct LxmlDocument *__pyx_v_doc = 0; int __pyx_v_r; - int __pyx_v_c_compression; + int __pyx_v_rclose; + CYTHON_UNUSED int __pyx_v_c_compression; const xmlChar *__pyx_v_c_encoding; xmlOutputBuffer *__pyx_v_c_buffer; - PyObject *__pyx_v_file_path = NULL; - char *__pyx_v_c_filename; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; @@ -188102,14 +188099,14 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_write_output(struct __p * """ * cdef _FilelikeWriter writer = None # <<<<<<<<<<<<<< * cdef _Document doc - * cdef int r, c_compression + * cdef int r, rclose, c_compression */ __Pyx_INCREF(Py_None); __pyx_v_writer = ((struct __pyx_obj_4lxml_5etree__FilelikeWriter *)Py_None); /* "src/lxml/xslt.pxi":724 * cdef _Document doc - * cdef int r, c_compression + * cdef int r, rclose, c_compression * cdef const_xmlChar* c_encoding = NULL # <<<<<<<<<<<<<< * cdef tree.xmlOutputBuffer* c_buffer * @@ -188201,7 +188198,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_write_output(struct __p * if doc is None: * raise XSLTSaveError("No document to serialise") # <<<<<<<<<<<<<< * c_compression = compression or 0 - * if _isString(file): + * xslt.LXML_GET_XSLT_ENCODING(c_encoding, self._xslt._c_style) */ __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_XSLTSaveError); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 734, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); @@ -188246,8 +188243,8 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_write_output(struct __p * if doc is None: * raise XSLTSaveError("No document to serialise") * c_compression = compression or 0 # <<<<<<<<<<<<<< - * if _isString(file): - * file_path = _encodeFilename(file) + * xslt.LXML_GET_XSLT_ENCODING(c_encoding, self._xslt._c_style) + * writer = _create_output_buffer(file, c_encoding, compression, &c_buffer, close=False) */ __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_compression); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(3, 735, __pyx_L1_error) if (!__pyx_t_2) { @@ -188263,40 +188260,42 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_write_output(struct __p /* "src/lxml/xslt.pxi":736 * raise XSLTSaveError("No document to serialise") * c_compression = compression or 0 - * if _isString(file): # <<<<<<<<<<<<<< - * file_path = _encodeFilename(file) - * c_filename = _cstr(file_path) + * xslt.LXML_GET_XSLT_ENCODING(c_encoding, self._xslt._c_style) # <<<<<<<<<<<<<< + * writer = _create_output_buffer(file, c_encoding, compression, &c_buffer, close=False) + * if writer is None: */ - __pyx_t_2 = (_isString(__pyx_v_file) != 0); - if (__pyx_t_2) { + LXML_GET_XSLT_ENCODING(__pyx_v_c_encoding, __pyx_v_self->_xslt->_c_style); - /* "src/lxml/xslt.pxi":737 + /* "src/lxml/xslt.pxi":737 * c_compression = compression or 0 - * if _isString(file): - * file_path = _encodeFilename(file) # <<<<<<<<<<<<<< - * c_filename = _cstr(file_path) + * xslt.LXML_GET_XSLT_ENCODING(c_encoding, self._xslt._c_style) + * writer = _create_output_buffer(file, c_encoding, compression, &c_buffer, close=False) # <<<<<<<<<<<<<< + * if writer is None: * with nogil: */ - __pyx_t_3 = __pyx_f_4lxml_5etree__encodeFilename(__pyx_v_file); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 737, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_v_file_path = __pyx_t_3; - __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_v_compression); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(3, 737, __pyx_L1_error) + __pyx_t_3 = ((PyObject *)__pyx_f_4lxml_5etree__create_output_buffer(__pyx_v_file, ((const char *)__pyx_v_c_encoding), __pyx_t_6, (&__pyx_v_c_buffer), 0)); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 737, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF_SET(__pyx_v_writer, ((struct __pyx_obj_4lxml_5etree__FilelikeWriter *)__pyx_t_3)); + __pyx_t_3 = 0; - /* "src/lxml/xslt.pxi":738 - * if _isString(file): - * file_path = _encodeFilename(file) - * c_filename = _cstr(file_path) # <<<<<<<<<<<<<< + /* "src/lxml/xslt.pxi":738 + * xslt.LXML_GET_XSLT_ENCODING(c_encoding, self._xslt._c_style) + * writer = _create_output_buffer(file, c_encoding, compression, &c_buffer, close=False) + * if writer is None: # <<<<<<<<<<<<<< * with nogil: - * r = xslt.xsltSaveResultToFilename( + * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) */ - __pyx_v_c_filename = PyBytes_AS_STRING(__pyx_v_file_path); + __pyx_t_2 = (((PyObject *)__pyx_v_writer) == Py_None); + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { /* "src/lxml/xslt.pxi":739 - * file_path = _encodeFilename(file) - * c_filename = _cstr(file_path) + * writer = _create_output_buffer(file, c_encoding, compression, &c_buffer, close=False) + * if writer is None: * with nogil: # <<<<<<<<<<<<<< - * r = xslt.xsltSaveResultToFilename( - * c_filename, doc._c_doc, self._xslt._c_style, c_compression) + * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) + * rclose = tree.xmlOutputBufferClose(c_buffer) */ { #ifdef WITH_THREAD @@ -188307,21 +188306,30 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_write_output(struct __p /*try:*/ { /* "src/lxml/xslt.pxi":740 - * c_filename = _cstr(file_path) + * if writer is None: + * with nogil: + * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) # <<<<<<<<<<<<<< + * rclose = tree.xmlOutputBufferClose(c_buffer) + * else: + */ + __pyx_v_r = xsltSaveResultTo(__pyx_v_c_buffer, __pyx_v_doc->_c_doc, __pyx_v_self->_xslt->_c_style); + + /* "src/lxml/xslt.pxi":741 * with nogil: - * r = xslt.xsltSaveResultToFilename( # <<<<<<<<<<<<<< - * c_filename, doc._c_doc, self._xslt._c_style, c_compression) + * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) + * rclose = tree.xmlOutputBufferClose(c_buffer) # <<<<<<<<<<<<<< * else: + * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) */ - __pyx_v_r = xsltSaveResultToFilename(__pyx_v_c_filename, __pyx_v_doc->_c_doc, __pyx_v_self->_xslt->_c_style, __pyx_v_c_compression); + __pyx_v_rclose = xmlOutputBufferClose(__pyx_v_c_buffer); } /* "src/lxml/xslt.pxi":739 - * file_path = _encodeFilename(file) - * c_filename = _cstr(file_path) + * writer = _create_output_buffer(file, c_encoding, compression, &c_buffer, close=False) + * if writer is None: * with nogil: # <<<<<<<<<<<<<< - * r = xslt.xsltSaveResultToFilename( - * c_filename, doc._c_doc, self._xslt._c_style, c_compression) + * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) + * rclose = tree.xmlOutputBufferClose(c_buffer) */ /*finally:*/ { /*normal exit:*/{ @@ -188335,175 +188343,102 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_write_output(struct __p } } - /* "src/lxml/xslt.pxi":736 - * raise XSLTSaveError("No document to serialise") - * c_compression = compression or 0 - * if _isString(file): # <<<<<<<<<<<<<< - * file_path = _encodeFilename(file) - * c_filename = _cstr(file_path) + /* "src/lxml/xslt.pxi":738 + * xslt.LXML_GET_XSLT_ENCODING(c_encoding, self._xslt._c_style) + * writer = _create_output_buffer(file, c_encoding, compression, &c_buffer, close=False) + * if writer is None: # <<<<<<<<<<<<<< + * with nogil: + * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) */ goto __pyx_L8; } /* "src/lxml/xslt.pxi":743 - * c_filename, doc._c_doc, self._xslt._c_style, c_compression) + * rclose = tree.xmlOutputBufferClose(c_buffer) * else: - * xslt.LXML_GET_XSLT_ENCODING(c_encoding, self._xslt._c_style) # <<<<<<<<<<<<<< - * writer = _create_output_buffer(file, c_encoding, compression, &c_buffer, close=False) - * if writer is None: + * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) # <<<<<<<<<<<<<< + * rclose = tree.xmlOutputBufferClose(c_buffer) + * if writer is not None: */ /*else*/ { - LXML_GET_XSLT_ENCODING(__pyx_v_c_encoding, __pyx_v_self->_xslt->_c_style); + __pyx_v_r = xsltSaveResultTo(__pyx_v_c_buffer, __pyx_v_doc->_c_doc, __pyx_v_self->_xslt->_c_style); /* "src/lxml/xslt.pxi":744 * else: - * xslt.LXML_GET_XSLT_ENCODING(c_encoding, self._xslt._c_style) - * writer = _create_output_buffer(file, c_encoding, compression, &c_buffer, close=False) # <<<<<<<<<<<<<< - * if writer is None: - * with nogil: - */ - __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_v_compression); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(3, 744, __pyx_L1_error) - __pyx_t_3 = ((PyObject *)__pyx_f_4lxml_5etree__create_output_buffer(__pyx_v_file, ((const char *)__pyx_v_c_encoding), __pyx_t_6, (&__pyx_v_c_buffer), 0)); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 744, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF_SET(__pyx_v_writer, ((struct __pyx_obj_4lxml_5etree__FilelikeWriter *)__pyx_t_3)); - __pyx_t_3 = 0; - - /* "src/lxml/xslt.pxi":745 - * xslt.LXML_GET_XSLT_ENCODING(c_encoding, self._xslt._c_style) - * writer = _create_output_buffer(file, c_encoding, compression, &c_buffer, close=False) - * if writer is None: # <<<<<<<<<<<<<< - * with nogil: - * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) - */ - __pyx_t_2 = (((PyObject *)__pyx_v_writer) == Py_None); - __pyx_t_1 = (__pyx_t_2 != 0); - if (__pyx_t_1) { - - /* "src/lxml/xslt.pxi":746 - * writer = _create_output_buffer(file, c_encoding, compression, &c_buffer, close=False) - * if writer is None: - * with nogil: # <<<<<<<<<<<<<< - * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) - * else: - */ - { - #ifdef WITH_THREAD - PyThreadState *_save; - Py_UNBLOCK_THREADS - __Pyx_FastGIL_Remember(); - #endif - /*try:*/ { - - /* "src/lxml/xslt.pxi":747 - * if writer is None: - * with nogil: - * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) # <<<<<<<<<<<<<< - * else: - * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) - */ - __pyx_v_r = xsltSaveResultTo(__pyx_v_c_buffer, __pyx_v_doc->_c_doc, __pyx_v_self->_xslt->_c_style); - } - - /* "src/lxml/xslt.pxi":746 - * writer = _create_output_buffer(file, c_encoding, compression, &c_buffer, close=False) - * if writer is None: - * with nogil: # <<<<<<<<<<<<<< - * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) - * else: - */ - /*finally:*/ { - /*normal exit:*/{ - #ifdef WITH_THREAD - __Pyx_FastGIL_Forget(); - Py_BLOCK_THREADS - #endif - goto __pyx_L15; - } - __pyx_L15:; - } - } - - /* "src/lxml/xslt.pxi":745 - * xslt.LXML_GET_XSLT_ENCODING(c_encoding, self._xslt._c_style) - * writer = _create_output_buffer(file, c_encoding, compression, &c_buffer, close=False) - * if writer is None: # <<<<<<<<<<<<<< - * with nogil: - * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) - */ - goto __pyx_L12; - } - - /* "src/lxml/xslt.pxi":749 - * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) - * else: - * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) # <<<<<<<<<<<<<< + * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) + * rclose = tree.xmlOutputBufferClose(c_buffer) # <<<<<<<<<<<<<< * if writer is not None: * writer._exc_context._raise_if_stored() */ - /*else*/ { - __pyx_v_r = xsltSaveResultTo(__pyx_v_c_buffer, __pyx_v_doc->_c_doc, __pyx_v_self->_xslt->_c_style); - } - __pyx_L12:; + __pyx_v_rclose = xmlOutputBufferClose(__pyx_v_c_buffer); } __pyx_L8:; - /* "src/lxml/xslt.pxi":750 - * else: - * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) + /* "src/lxml/xslt.pxi":745 + * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) + * rclose = tree.xmlOutputBufferClose(c_buffer) * if writer is not None: # <<<<<<<<<<<<<< * writer._exc_context._raise_if_stored() - * if r == -1: + * if r < 0 or rclose < 0: */ __pyx_t_1 = (((PyObject *)__pyx_v_writer) != Py_None); __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "src/lxml/xslt.pxi":751 - * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) + /* "src/lxml/xslt.pxi":746 + * rclose = tree.xmlOutputBufferClose(c_buffer) * if writer is not None: * writer._exc_context._raise_if_stored() # <<<<<<<<<<<<<< - * if r == -1: + * if r < 0 or rclose < 0: * python.PyErr_SetFromErrno(XSLTSaveError) # raises */ - __pyx_t_6 = ((struct __pyx_vtabstruct_4lxml_5etree__ExceptionContext *)__pyx_v_writer->_exc_context->__pyx_vtab)->_raise_if_stored(__pyx_v_writer->_exc_context); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(3, 751, __pyx_L1_error) + __pyx_t_6 = ((struct __pyx_vtabstruct_4lxml_5etree__ExceptionContext *)__pyx_v_writer->_exc_context->__pyx_vtab)->_raise_if_stored(__pyx_v_writer->_exc_context); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(3, 746, __pyx_L1_error) - /* "src/lxml/xslt.pxi":750 - * else: - * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) + /* "src/lxml/xslt.pxi":745 + * r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) + * rclose = tree.xmlOutputBufferClose(c_buffer) * if writer is not None: # <<<<<<<<<<<<<< * writer._exc_context._raise_if_stored() - * if r == -1: + * if r < 0 or rclose < 0: */ } - /* "src/lxml/xslt.pxi":752 + /* "src/lxml/xslt.pxi":747 * if writer is not None: * writer._exc_context._raise_if_stored() - * if r == -1: # <<<<<<<<<<<<<< + * if r < 0 or rclose < 0: # <<<<<<<<<<<<<< * python.PyErr_SetFromErrno(XSLTSaveError) # raises * */ - __pyx_t_2 = ((__pyx_v_r == -1L) != 0); + __pyx_t_1 = ((__pyx_v_r < 0) != 0); + if (!__pyx_t_1) { + } else { + __pyx_t_2 = __pyx_t_1; + goto __pyx_L14_bool_binop_done; + } + __pyx_t_1 = ((__pyx_v_rclose < 0) != 0); + __pyx_t_2 = __pyx_t_1; + __pyx_L14_bool_binop_done:; if (__pyx_t_2) { - /* "src/lxml/xslt.pxi":753 + /* "src/lxml/xslt.pxi":748 * writer._exc_context._raise_if_stored() - * if r == -1: + * if r < 0 or rclose < 0: * python.PyErr_SetFromErrno(XSLTSaveError) # raises # <<<<<<<<<<<<<< * * cdef _saveToStringAndSize(self, xmlChar** s, int* l): */ - __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_XSLTSaveError); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 753, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_XSLTSaveError); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 748, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyErr_SetFromErrno(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 753, __pyx_L1_error) + __pyx_t_4 = PyErr_SetFromErrno(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 748, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "src/lxml/xslt.pxi":752 + /* "src/lxml/xslt.pxi":747 * if writer is not None: * writer._exc_context._raise_if_stored() - * if r == -1: # <<<<<<<<<<<<<< + * if r < 0 or rclose < 0: # <<<<<<<<<<<<<< * python.PyErr_SetFromErrno(XSLTSaveError) # raises * */ @@ -188529,13 +188464,12 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_write_output(struct __p __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_writer); __Pyx_XDECREF((PyObject *)__pyx_v_doc); - __Pyx_XDECREF(__pyx_v_file_path); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "src/lxml/xslt.pxi":755 +/* "src/lxml/xslt.pxi":750 * python.PyErr_SetFromErrno(XSLTSaveError) # raises * * cdef _saveToStringAndSize(self, xmlChar** s, int* l): # <<<<<<<<<<<<<< @@ -188553,7 +188487,7 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str PyObject *__pyx_t_3 = NULL; __Pyx_RefNannySetupContext("_saveToStringAndSize", 0); - /* "src/lxml/xslt.pxi":758 + /* "src/lxml/xslt.pxi":753 * cdef _Document doc * cdef int r * if self._context_node is not None: # <<<<<<<<<<<<<< @@ -188564,7 +188498,7 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "src/lxml/xslt.pxi":759 + /* "src/lxml/xslt.pxi":754 * cdef int r * if self._context_node is not None: * doc = self._context_node._doc # <<<<<<<<<<<<<< @@ -188576,7 +188510,7 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str __pyx_v_doc = ((struct LxmlDocument *)__pyx_t_3); __pyx_t_3 = 0; - /* "src/lxml/xslt.pxi":758 + /* "src/lxml/xslt.pxi":753 * cdef _Document doc * cdef int r * if self._context_node is not None: # <<<<<<<<<<<<<< @@ -188586,7 +188520,7 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str goto __pyx_L3; } - /* "src/lxml/xslt.pxi":761 + /* "src/lxml/xslt.pxi":756 * doc = self._context_node._doc * else: * doc = None # <<<<<<<<<<<<<< @@ -188599,7 +188533,7 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str } __pyx_L3:; - /* "src/lxml/xslt.pxi":762 + /* "src/lxml/xslt.pxi":757 * else: * doc = None * if doc is None: # <<<<<<<<<<<<<< @@ -188610,7 +188544,7 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str __pyx_t_1 = (__pyx_t_2 != 0); if (__pyx_t_1) { - /* "src/lxml/xslt.pxi":763 + /* "src/lxml/xslt.pxi":758 * doc = None * if doc is None: * doc = self._doc # <<<<<<<<<<<<<< @@ -188622,7 +188556,7 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str __Pyx_DECREF_SET(__pyx_v_doc, ((struct LxmlDocument *)__pyx_t_3)); __pyx_t_3 = 0; - /* "src/lxml/xslt.pxi":764 + /* "src/lxml/xslt.pxi":759 * if doc is None: * doc = self._doc * if doc is None: # <<<<<<<<<<<<<< @@ -188633,7 +188567,7 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "src/lxml/xslt.pxi":765 + /* "src/lxml/xslt.pxi":760 * doc = self._doc * if doc is None: * s[0] = NULL # <<<<<<<<<<<<<< @@ -188642,7 +188576,7 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str */ (__pyx_v_s[0]) = NULL; - /* "src/lxml/xslt.pxi":766 + /* "src/lxml/xslt.pxi":761 * if doc is None: * s[0] = NULL * return # <<<<<<<<<<<<<< @@ -188653,7 +188587,7 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; - /* "src/lxml/xslt.pxi":764 + /* "src/lxml/xslt.pxi":759 * if doc is None: * doc = self._doc * if doc is None: # <<<<<<<<<<<<<< @@ -188662,7 +188596,7 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str */ } - /* "src/lxml/xslt.pxi":762 + /* "src/lxml/xslt.pxi":757 * else: * doc = None * if doc is None: # <<<<<<<<<<<<<< @@ -188671,7 +188605,7 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str */ } - /* "src/lxml/xslt.pxi":767 + /* "src/lxml/xslt.pxi":762 * s[0] = NULL * return * with nogil: # <<<<<<<<<<<<<< @@ -188686,7 +188620,7 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str #endif /*try:*/ { - /* "src/lxml/xslt.pxi":768 + /* "src/lxml/xslt.pxi":763 * return * with nogil: * r = xslt.xsltSaveResultToString(s, l, doc._c_doc, # <<<<<<<<<<<<<< @@ -188696,7 +188630,7 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str __pyx_v_r = xsltSaveResultToString(__pyx_v_s, __pyx_v_l, __pyx_v_doc->_c_doc, __pyx_v_self->_xslt->_c_style); } - /* "src/lxml/xslt.pxi":767 + /* "src/lxml/xslt.pxi":762 * s[0] = NULL * return * with nogil: # <<<<<<<<<<<<<< @@ -188715,7 +188649,7 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str } } - /* "src/lxml/xslt.pxi":770 + /* "src/lxml/xslt.pxi":765 * r = xslt.xsltSaveResultToString(s, l, doc._c_doc, * self._xslt._c_style) * if r == -1: # <<<<<<<<<<<<<< @@ -188725,16 +188659,16 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str __pyx_t_2 = ((__pyx_v_r == -1L) != 0); if (unlikely(__pyx_t_2)) { - /* "src/lxml/xslt.pxi":771 + /* "src/lxml/xslt.pxi":766 * self._xslt._c_style) * if r == -1: * raise MemoryError() # <<<<<<<<<<<<<< * * def __str__(self): */ - PyErr_NoMemory(); __PYX_ERR(3, 771, __pyx_L1_error) + PyErr_NoMemory(); __PYX_ERR(3, 766, __pyx_L1_error) - /* "src/lxml/xslt.pxi":770 + /* "src/lxml/xslt.pxi":765 * r = xslt.xsltSaveResultToString(s, l, doc._c_doc, * self._xslt._c_style) * if r == -1: # <<<<<<<<<<<<<< @@ -188743,7 +188677,7 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str */ } - /* "src/lxml/xslt.pxi":755 + /* "src/lxml/xslt.pxi":750 * python.PyErr_SetFromErrno(XSLTSaveError) # raises * * cdef _saveToStringAndSize(self, xmlChar** s, int* l): # <<<<<<<<<<<<<< @@ -188765,7 +188699,7 @@ static PyObject *__pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(str return __pyx_r; } -/* "src/lxml/xslt.pxi":773 +/* "src/lxml/xslt.pxi":768 * raise MemoryError() * * def __str__(self): # <<<<<<<<<<<<<< @@ -188807,7 +188741,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_2__str__(struct __pyx_o PyObject *__pyx_t_13 = NULL; __Pyx_RefNannySetupContext("__str__", 0); - /* "src/lxml/xslt.pxi":774 + /* "src/lxml/xslt.pxi":769 * * def __str__(self): * cdef xmlChar* s = NULL # <<<<<<<<<<<<<< @@ -188816,7 +188750,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_2__str__(struct __pyx_o */ __pyx_v_s = NULL; - /* "src/lxml/xslt.pxi":775 + /* "src/lxml/xslt.pxi":770 * def __str__(self): * cdef xmlChar* s = NULL * cdef int l = 0 # <<<<<<<<<<<<<< @@ -188825,7 +188759,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_2__str__(struct __pyx_o */ __pyx_v_l = 0; - /* "src/lxml/xslt.pxi":776 + /* "src/lxml/xslt.pxi":771 * cdef xmlChar* s = NULL * cdef int l = 0 * if not python.IS_PYTHON2: # <<<<<<<<<<<<<< @@ -188835,7 +188769,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_2__str__(struct __pyx_o __pyx_t_1 = ((!(IS_PYTHON2 != 0)) != 0); if (__pyx_t_1) { - /* "src/lxml/xslt.pxi":777 + /* "src/lxml/xslt.pxi":772 * cdef int l = 0 * if not python.IS_PYTHON2: * return self.__unicode__() # <<<<<<<<<<<<<< @@ -188843,7 +188777,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_2__str__(struct __pyx_o * if s is NULL: */ __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_unicode_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 777, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_unicode_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 772, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { @@ -188857,14 +188791,14 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_2__str__(struct __pyx_o } __pyx_t_2 = (__pyx_t_4) ? __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4) : __Pyx_PyObject_CallNoArg(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(3, 777, __pyx_L1_error) + if (unlikely(!__pyx_t_2)) __PYX_ERR(3, 772, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "src/lxml/xslt.pxi":776 + /* "src/lxml/xslt.pxi":771 * cdef xmlChar* s = NULL * cdef int l = 0 * if not python.IS_PYTHON2: # <<<<<<<<<<<<<< @@ -188873,18 +188807,18 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_2__str__(struct __pyx_o */ } - /* "src/lxml/xslt.pxi":778 + /* "src/lxml/xslt.pxi":773 * if not python.IS_PYTHON2: * return self.__unicode__() * self._saveToStringAndSize(&s, &l) # <<<<<<<<<<<<<< * if s is NULL: * return '' */ - __pyx_t_2 = __pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(__pyx_v_self, (&__pyx_v_s), (&__pyx_v_l)); if (unlikely(!__pyx_t_2)) __PYX_ERR(3, 778, __pyx_L1_error) + __pyx_t_2 = __pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(__pyx_v_self, (&__pyx_v_s), (&__pyx_v_l)); if (unlikely(!__pyx_t_2)) __PYX_ERR(3, 773, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "src/lxml/xslt.pxi":779 + /* "src/lxml/xslt.pxi":774 * return self.__unicode__() * self._saveToStringAndSize(&s, &l) * if s is NULL: # <<<<<<<<<<<<<< @@ -188894,7 +188828,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_2__str__(struct __pyx_o __pyx_t_1 = ((__pyx_v_s == NULL) != 0); if (__pyx_t_1) { - /* "src/lxml/xslt.pxi":780 + /* "src/lxml/xslt.pxi":775 * self._saveToStringAndSize(&s, &l) * if s is NULL: * return '' # <<<<<<<<<<<<<< @@ -188906,7 +188840,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_2__str__(struct __pyx_o __pyx_r = __pyx_kp_s__11; goto __pyx_L0; - /* "src/lxml/xslt.pxi":779 + /* "src/lxml/xslt.pxi":774 * return self.__unicode__() * self._saveToStringAndSize(&s, &l) * if s is NULL: # <<<<<<<<<<<<<< @@ -188915,7 +188849,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_2__str__(struct __pyx_o */ } - /* "src/lxml/xslt.pxi":782 + /* "src/lxml/xslt.pxi":777 * return '' * # we must not use 'funicode()' here as this is not always UTF-8 * try: # <<<<<<<<<<<<<< @@ -188924,14 +188858,14 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_2__str__(struct __pyx_o */ /*try:*/ { - /* "src/lxml/xslt.pxi":783 + /* "src/lxml/xslt.pxi":778 * # we must not use 'funicode()' here as this is not always UTF-8 * try: * result = s[:l] # <<<<<<<<<<<<<< * finally: * tree.xmlFree(s) */ - __pyx_t_2 = __Pyx_PyBytes_FromStringAndSize(((const char*)__pyx_v_s) + 0, __pyx_v_l - 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(3, 783, __pyx_L6_error) + __pyx_t_2 = __Pyx_PyBytes_FromStringAndSize(((const char*)__pyx_v_s) + 0, __pyx_v_l - 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(3, 778, __pyx_L6_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __pyx_t_2; __Pyx_INCREF(__pyx_t_3); @@ -188940,7 +188874,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_2__str__(struct __pyx_o __pyx_t_3 = 0; } - /* "src/lxml/xslt.pxi":785 + /* "src/lxml/xslt.pxi":780 * result = s[:l] * finally: * tree.xmlFree(s) # <<<<<<<<<<<<<< @@ -188989,7 +188923,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_2__str__(struct __pyx_o __pyx_L7:; } - /* "src/lxml/xslt.pxi":786 + /* "src/lxml/xslt.pxi":781 * finally: * tree.xmlFree(s) * return result # <<<<<<<<<<<<<< @@ -189001,7 +188935,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_2__str__(struct __pyx_o __pyx_r = __pyx_v_result; goto __pyx_L0; - /* "src/lxml/xslt.pxi":773 + /* "src/lxml/xslt.pxi":768 * raise MemoryError() * * def __str__(self): # <<<<<<<<<<<<<< @@ -189023,7 +188957,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_2__str__(struct __pyx_o return __pyx_r; } -/* "src/lxml/xslt.pxi":788 +/* "src/lxml/xslt.pxi":783 * return result * * def __unicode__(self): # <<<<<<<<<<<<<< @@ -189066,7 +189000,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_4__unicode__(struct __p PyObject *__pyx_t_12 = NULL; __Pyx_RefNannySetupContext("__unicode__", 0); - /* "src/lxml/xslt.pxi":790 + /* "src/lxml/xslt.pxi":785 * def __unicode__(self): * cdef xmlChar* encoding * cdef xmlChar* s = NULL # <<<<<<<<<<<<<< @@ -189075,7 +189009,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_4__unicode__(struct __p */ __pyx_v_s = NULL; - /* "src/lxml/xslt.pxi":791 + /* "src/lxml/xslt.pxi":786 * cdef xmlChar* encoding * cdef xmlChar* s = NULL * cdef int l = 0 # <<<<<<<<<<<<<< @@ -189084,18 +189018,18 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_4__unicode__(struct __p */ __pyx_v_l = 0; - /* "src/lxml/xslt.pxi":792 + /* "src/lxml/xslt.pxi":787 * cdef xmlChar* s = NULL * cdef int l = 0 * self._saveToStringAndSize(&s, &l) # <<<<<<<<<<<<<< * if s is NULL: * return u'' */ - __pyx_t_1 = __pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(__pyx_v_self, (&__pyx_v_s), (&__pyx_v_l)); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 792, __pyx_L1_error) + __pyx_t_1 = __pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(__pyx_v_self, (&__pyx_v_s), (&__pyx_v_l)); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 787, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "src/lxml/xslt.pxi":793 + /* "src/lxml/xslt.pxi":788 * cdef int l = 0 * self._saveToStringAndSize(&s, &l) * if s is NULL: # <<<<<<<<<<<<<< @@ -189105,7 +189039,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_4__unicode__(struct __p __pyx_t_2 = ((__pyx_v_s == NULL) != 0); if (__pyx_t_2) { - /* "src/lxml/xslt.pxi":794 + /* "src/lxml/xslt.pxi":789 * self._saveToStringAndSize(&s, &l) * if s is NULL: * return u'' # <<<<<<<<<<<<<< @@ -189117,7 +189051,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_4__unicode__(struct __p __pyx_r = __pyx_kp_u__11; goto __pyx_L0; - /* "src/lxml/xslt.pxi":793 + /* "src/lxml/xslt.pxi":788 * cdef int l = 0 * self._saveToStringAndSize(&s, &l) * if s is NULL: # <<<<<<<<<<<<<< @@ -189126,7 +189060,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_4__unicode__(struct __p */ } - /* "src/lxml/xslt.pxi":795 + /* "src/lxml/xslt.pxi":790 * if s is NULL: * return u'' * encoding = self._xslt._c_style.encoding # <<<<<<<<<<<<<< @@ -189136,7 +189070,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_4__unicode__(struct __p __pyx_t_3 = __pyx_v_self->_xslt->_c_style->encoding; __pyx_v_encoding = __pyx_t_3; - /* "src/lxml/xslt.pxi":796 + /* "src/lxml/xslt.pxi":791 * return u'' * encoding = self._xslt._c_style.encoding * try: # <<<<<<<<<<<<<< @@ -189145,7 +189079,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_4__unicode__(struct __p */ /*try:*/ { - /* "src/lxml/xslt.pxi":797 + /* "src/lxml/xslt.pxi":792 * encoding = self._xslt._c_style.encoding * try: * if encoding is NULL: # <<<<<<<<<<<<<< @@ -189155,19 +189089,19 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_4__unicode__(struct __p __pyx_t_2 = ((__pyx_v_encoding == NULL) != 0); if (__pyx_t_2) { - /* "src/lxml/xslt.pxi":798 + /* "src/lxml/xslt.pxi":793 * try: * if encoding is NULL: * result = s[:l].decode('UTF-8') # <<<<<<<<<<<<<< * else: * result = s[:l].decode(encoding) */ - __pyx_t_1 = __Pyx_decode_c_string(((char const *)__pyx_v_s), 0, __pyx_v_l, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 798, __pyx_L5_error) + __pyx_t_1 = __Pyx_decode_c_string(((char const *)__pyx_v_s), 0, __pyx_v_l, NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 793, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_result = __pyx_t_1; __pyx_t_1 = 0; - /* "src/lxml/xslt.pxi":797 + /* "src/lxml/xslt.pxi":792 * encoding = self._xslt._c_style.encoding * try: * if encoding is NULL: # <<<<<<<<<<<<<< @@ -189177,7 +189111,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_4__unicode__(struct __p goto __pyx_L7; } - /* "src/lxml/xslt.pxi":800 + /* "src/lxml/xslt.pxi":795 * result = s[:l].decode('UTF-8') * else: * result = s[:l].decode(encoding) # <<<<<<<<<<<<<< @@ -189185,7 +189119,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_4__unicode__(struct __p * tree.xmlFree(s) */ /*else*/ { - __pyx_t_1 = __Pyx_decode_c_string(((char const *)__pyx_v_s), 0, __pyx_v_l, ((char const *)__pyx_v_encoding), NULL, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 800, __pyx_L5_error) + __pyx_t_1 = __Pyx_decode_c_string(((char const *)__pyx_v_s), 0, __pyx_v_l, ((char const *)__pyx_v_encoding), NULL, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 795, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_result = __pyx_t_1; __pyx_t_1 = 0; @@ -189193,7 +189127,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_4__unicode__(struct __p __pyx_L7:; } - /* "src/lxml/xslt.pxi":802 + /* "src/lxml/xslt.pxi":797 * result = s[:l].decode(encoding) * finally: * tree.xmlFree(s) # <<<<<<<<<<<<<< @@ -189240,7 +189174,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_4__unicode__(struct __p __pyx_L6:; } - /* "src/lxml/xslt.pxi":803 + /* "src/lxml/xslt.pxi":798 * finally: * tree.xmlFree(s) * return _stripEncodingDeclaration(result) # <<<<<<<<<<<<<< @@ -189248,13 +189182,13 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_4__unicode__(struct __p * def __getbuffer__(self, Py_buffer* buffer, int flags): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __pyx_f_4lxml_5etree__stripEncodingDeclaration(__pyx_v_result); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 803, __pyx_L1_error) + __pyx_t_1 = __pyx_f_4lxml_5etree__stripEncodingDeclaration(__pyx_v_result); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 798, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "src/lxml/xslt.pxi":788 + /* "src/lxml/xslt.pxi":783 * return result * * def __unicode__(self): # <<<<<<<<<<<<<< @@ -189274,7 +189208,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_4__unicode__(struct __p return __pyx_r; } -/* "src/lxml/xslt.pxi":805 +/* "src/lxml/xslt.pxi":800 * return _stripEncodingDeclaration(result) * * def __getbuffer__(self, Py_buffer* buffer, int flags): # <<<<<<<<<<<<<< @@ -189312,7 +189246,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o __pyx_v_buffer->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_buffer->obj); - /* "src/lxml/xslt.pxi":806 + /* "src/lxml/xslt.pxi":801 * * def __getbuffer__(self, Py_buffer* buffer, int flags): * cdef int l = 0 # <<<<<<<<<<<<<< @@ -189321,7 +189255,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o */ __pyx_v_l = 0; - /* "src/lxml/xslt.pxi":807 + /* "src/lxml/xslt.pxi":802 * def __getbuffer__(self, Py_buffer* buffer, int flags): * cdef int l = 0 * if buffer is NULL: # <<<<<<<<<<<<<< @@ -189331,7 +189265,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o __pyx_t_1 = ((__pyx_v_buffer == NULL) != 0); if (__pyx_t_1) { - /* "src/lxml/xslt.pxi":808 + /* "src/lxml/xslt.pxi":803 * cdef int l = 0 * if buffer is NULL: * return # <<<<<<<<<<<<<< @@ -189341,7 +189275,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o __pyx_r = 0; goto __pyx_L0; - /* "src/lxml/xslt.pxi":807 + /* "src/lxml/xslt.pxi":802 * def __getbuffer__(self, Py_buffer* buffer, int flags): * cdef int l = 0 * if buffer is NULL: # <<<<<<<<<<<<<< @@ -189350,7 +189284,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o */ } - /* "src/lxml/xslt.pxi":809 + /* "src/lxml/xslt.pxi":804 * if buffer is NULL: * return * if self._buffer is NULL or flags & python.PyBUF_WRITABLE: # <<<<<<<<<<<<<< @@ -189368,18 +189302,18 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o __pyx_L5_bool_binop_done:; if (__pyx_t_1) { - /* "src/lxml/xslt.pxi":810 + /* "src/lxml/xslt.pxi":805 * return * if self._buffer is NULL or flags & python.PyBUF_WRITABLE: * self._saveToStringAndSize(&buffer.buf, &l) # <<<<<<<<<<<<<< * buffer.len = l * if self._buffer is NULL and not flags & python.PyBUF_WRITABLE: */ - __pyx_t_3 = __pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(__pyx_v_self, ((xmlChar **)(&__pyx_v_buffer->buf)), (&__pyx_v_l)); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 810, __pyx_L1_error) + __pyx_t_3 = __pyx_f_4lxml_5etree_15_XSLTResultTree__saveToStringAndSize(__pyx_v_self, ((xmlChar **)(&__pyx_v_buffer->buf)), (&__pyx_v_l)); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 805, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "src/lxml/xslt.pxi":811 + /* "src/lxml/xslt.pxi":806 * if self._buffer is NULL or flags & python.PyBUF_WRITABLE: * self._saveToStringAndSize(&buffer.buf, &l) * buffer.len = l # <<<<<<<<<<<<<< @@ -189388,7 +189322,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o */ __pyx_v_buffer->len = __pyx_v_l; - /* "src/lxml/xslt.pxi":812 + /* "src/lxml/xslt.pxi":807 * self._saveToStringAndSize(&buffer.buf, &l) * buffer.len = l * if self._buffer is NULL and not flags & python.PyBUF_WRITABLE: # <<<<<<<<<<<<<< @@ -189406,7 +189340,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o __pyx_L8_bool_binop_done:; if (__pyx_t_1) { - /* "src/lxml/xslt.pxi":813 + /* "src/lxml/xslt.pxi":808 * buffer.len = l * if self._buffer is NULL and not flags & python.PyBUF_WRITABLE: * self._buffer = buffer.buf # <<<<<<<<<<<<<< @@ -189415,7 +189349,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o */ __pyx_v_self->_buffer = ((xmlChar *)__pyx_v_buffer->buf); - /* "src/lxml/xslt.pxi":814 + /* "src/lxml/xslt.pxi":809 * if self._buffer is NULL and not flags & python.PyBUF_WRITABLE: * self._buffer = buffer.buf * self._buffer_len = l # <<<<<<<<<<<<<< @@ -189424,7 +189358,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o */ __pyx_v_self->_buffer_len = __pyx_v_l; - /* "src/lxml/xslt.pxi":815 + /* "src/lxml/xslt.pxi":810 * self._buffer = buffer.buf * self._buffer_len = l * self._buffer_refcnt = 1 # <<<<<<<<<<<<<< @@ -189433,7 +189367,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o */ __pyx_v_self->_buffer_refcnt = 1; - /* "src/lxml/xslt.pxi":812 + /* "src/lxml/xslt.pxi":807 * self._saveToStringAndSize(&buffer.buf, &l) * buffer.len = l * if self._buffer is NULL and not flags & python.PyBUF_WRITABLE: # <<<<<<<<<<<<<< @@ -189442,7 +189376,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o */ } - /* "src/lxml/xslt.pxi":809 + /* "src/lxml/xslt.pxi":804 * if buffer is NULL: * return * if self._buffer is NULL or flags & python.PyBUF_WRITABLE: # <<<<<<<<<<<<<< @@ -189452,7 +189386,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o goto __pyx_L4; } - /* "src/lxml/xslt.pxi":817 + /* "src/lxml/xslt.pxi":812 * self._buffer_refcnt = 1 * else: * buffer.buf = self._buffer # <<<<<<<<<<<<<< @@ -189463,7 +189397,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o __pyx_t_4 = __pyx_v_self->_buffer; __pyx_v_buffer->buf = __pyx_t_4; - /* "src/lxml/xslt.pxi":818 + /* "src/lxml/xslt.pxi":813 * else: * buffer.buf = self._buffer * buffer.len = self._buffer_len # <<<<<<<<<<<<<< @@ -189473,7 +189407,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o __pyx_t_5 = __pyx_v_self->_buffer_len; __pyx_v_buffer->len = __pyx_t_5; - /* "src/lxml/xslt.pxi":819 + /* "src/lxml/xslt.pxi":814 * buffer.buf = self._buffer * buffer.len = self._buffer_len * self._buffer_refcnt += 1 # <<<<<<<<<<<<<< @@ -189484,7 +189418,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o } __pyx_L4:; - /* "src/lxml/xslt.pxi":820 + /* "src/lxml/xslt.pxi":815 * buffer.len = self._buffer_len * self._buffer_refcnt += 1 * if flags & python.PyBUF_WRITABLE: # <<<<<<<<<<<<<< @@ -189494,7 +189428,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o __pyx_t_1 = ((__pyx_v_flags & PyBUF_WRITABLE) != 0); if (__pyx_t_1) { - /* "src/lxml/xslt.pxi":821 + /* "src/lxml/xslt.pxi":816 * self._buffer_refcnt += 1 * if flags & python.PyBUF_WRITABLE: * buffer.readonly = 0 # <<<<<<<<<<<<<< @@ -189503,7 +189437,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o */ __pyx_v_buffer->readonly = 0; - /* "src/lxml/xslt.pxi":820 + /* "src/lxml/xslt.pxi":815 * buffer.len = self._buffer_len * self._buffer_refcnt += 1 * if flags & python.PyBUF_WRITABLE: # <<<<<<<<<<<<<< @@ -189513,7 +189447,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o goto __pyx_L10; } - /* "src/lxml/xslt.pxi":823 + /* "src/lxml/xslt.pxi":818 * buffer.readonly = 0 * else: * buffer.readonly = 1 # <<<<<<<<<<<<<< @@ -189525,7 +189459,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o } __pyx_L10:; - /* "src/lxml/xslt.pxi":824 + /* "src/lxml/xslt.pxi":819 * else: * buffer.readonly = 1 * if flags & python.PyBUF_FORMAT: # <<<<<<<<<<<<<< @@ -189535,7 +189469,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); if (__pyx_t_1) { - /* "src/lxml/xslt.pxi":825 + /* "src/lxml/xslt.pxi":820 * buffer.readonly = 1 * if flags & python.PyBUF_FORMAT: * buffer.format = "B" # <<<<<<<<<<<<<< @@ -189544,7 +189478,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o */ __pyx_v_buffer->format = ((char *)"B"); - /* "src/lxml/xslt.pxi":824 + /* "src/lxml/xslt.pxi":819 * else: * buffer.readonly = 1 * if flags & python.PyBUF_FORMAT: # <<<<<<<<<<<<<< @@ -189554,7 +189488,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o goto __pyx_L11; } - /* "src/lxml/xslt.pxi":827 + /* "src/lxml/xslt.pxi":822 * buffer.format = "B" * else: * buffer.format = NULL # <<<<<<<<<<<<<< @@ -189566,7 +189500,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o } __pyx_L11:; - /* "src/lxml/xslt.pxi":828 + /* "src/lxml/xslt.pxi":823 * else: * buffer.format = NULL * buffer.ndim = 0 # <<<<<<<<<<<<<< @@ -189575,7 +189509,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o */ __pyx_v_buffer->ndim = 0; - /* "src/lxml/xslt.pxi":829 + /* "src/lxml/xslt.pxi":824 * buffer.format = NULL * buffer.ndim = 0 * buffer.shape = NULL # <<<<<<<<<<<<<< @@ -189584,7 +189518,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o */ __pyx_v_buffer->shape = NULL; - /* "src/lxml/xslt.pxi":830 + /* "src/lxml/xslt.pxi":825 * buffer.ndim = 0 * buffer.shape = NULL * buffer.strides = NULL # <<<<<<<<<<<<<< @@ -189593,7 +189527,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o */ __pyx_v_buffer->strides = NULL; - /* "src/lxml/xslt.pxi":831 + /* "src/lxml/xslt.pxi":826 * buffer.shape = NULL * buffer.strides = NULL * buffer.suboffsets = NULL # <<<<<<<<<<<<<< @@ -189602,7 +189536,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o */ __pyx_v_buffer->suboffsets = NULL; - /* "src/lxml/xslt.pxi":832 + /* "src/lxml/xslt.pxi":827 * buffer.strides = NULL * buffer.suboffsets = NULL * buffer.itemsize = 1 # <<<<<<<<<<<<<< @@ -189611,7 +189545,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o */ __pyx_v_buffer->itemsize = 1; - /* "src/lxml/xslt.pxi":833 + /* "src/lxml/xslt.pxi":828 * buffer.suboffsets = NULL * buffer.itemsize = 1 * buffer.internal = NULL # <<<<<<<<<<<<<< @@ -189620,7 +189554,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o */ __pyx_v_buffer->internal = NULL; - /* "src/lxml/xslt.pxi":834 + /* "src/lxml/xslt.pxi":829 * buffer.itemsize = 1 * buffer.internal = NULL * if buffer.obj is not self: # set by Cython? # <<<<<<<<<<<<<< @@ -189631,7 +189565,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "src/lxml/xslt.pxi":835 + /* "src/lxml/xslt.pxi":830 * buffer.internal = NULL * if buffer.obj is not self: # set by Cython? * buffer.obj = self # <<<<<<<<<<<<<< @@ -189644,7 +189578,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o __Pyx_DECREF(__pyx_v_buffer->obj); __pyx_v_buffer->obj = ((PyObject *)__pyx_v_self); - /* "src/lxml/xslt.pxi":834 + /* "src/lxml/xslt.pxi":829 * buffer.itemsize = 1 * buffer.internal = NULL * if buffer.obj is not self: # set by Cython? # <<<<<<<<<<<<<< @@ -189653,7 +189587,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o */ } - /* "src/lxml/xslt.pxi":805 + /* "src/lxml/xslt.pxi":800 * return _stripEncodingDeclaration(result) * * def __getbuffer__(self, Py_buffer* buffer, int flags): # <<<<<<<<<<<<<< @@ -189683,7 +189617,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_6__getbuffer__(struct __pyx_o return __pyx_r; } -/* "src/lxml/xslt.pxi":837 +/* "src/lxml/xslt.pxi":832 * buffer.obj = self * * def __releasebuffer__(self, Py_buffer* buffer): # <<<<<<<<<<<<<< @@ -189707,7 +189641,7 @@ static void __pyx_pf_4lxml_5etree_15_XSLTResultTree_8__releasebuffer__(struct __ int __pyx_t_1; __Pyx_RefNannySetupContext("__releasebuffer__", 0); - /* "src/lxml/xslt.pxi":838 + /* "src/lxml/xslt.pxi":833 * * def __releasebuffer__(self, Py_buffer* buffer): * if buffer is NULL: # <<<<<<<<<<<<<< @@ -189717,7 +189651,7 @@ static void __pyx_pf_4lxml_5etree_15_XSLTResultTree_8__releasebuffer__(struct __ __pyx_t_1 = ((__pyx_v_buffer == NULL) != 0); if (__pyx_t_1) { - /* "src/lxml/xslt.pxi":839 + /* "src/lxml/xslt.pxi":834 * def __releasebuffer__(self, Py_buffer* buffer): * if buffer is NULL: * return # <<<<<<<<<<<<<< @@ -189726,7 +189660,7 @@ static void __pyx_pf_4lxml_5etree_15_XSLTResultTree_8__releasebuffer__(struct __ */ goto __pyx_L0; - /* "src/lxml/xslt.pxi":838 + /* "src/lxml/xslt.pxi":833 * * def __releasebuffer__(self, Py_buffer* buffer): * if buffer is NULL: # <<<<<<<<<<<<<< @@ -189735,7 +189669,7 @@ static void __pyx_pf_4lxml_5etree_15_XSLTResultTree_8__releasebuffer__(struct __ */ } - /* "src/lxml/xslt.pxi":840 + /* "src/lxml/xslt.pxi":835 * if buffer is NULL: * return * if buffer.buf is self._buffer: # <<<<<<<<<<<<<< @@ -189745,7 +189679,7 @@ static void __pyx_pf_4lxml_5etree_15_XSLTResultTree_8__releasebuffer__(struct __ __pyx_t_1 = ((((xmlChar *)__pyx_v_buffer->buf) == __pyx_v_self->_buffer) != 0); if (__pyx_t_1) { - /* "src/lxml/xslt.pxi":841 + /* "src/lxml/xslt.pxi":836 * return * if buffer.buf is self._buffer: * self._buffer_refcnt -= 1 # <<<<<<<<<<<<<< @@ -189754,7 +189688,7 @@ static void __pyx_pf_4lxml_5etree_15_XSLTResultTree_8__releasebuffer__(struct __ */ __pyx_v_self->_buffer_refcnt = (__pyx_v_self->_buffer_refcnt - 1); - /* "src/lxml/xslt.pxi":842 + /* "src/lxml/xslt.pxi":837 * if buffer.buf is self._buffer: * self._buffer_refcnt -= 1 * if self._buffer_refcnt == 0: # <<<<<<<<<<<<<< @@ -189764,7 +189698,7 @@ static void __pyx_pf_4lxml_5etree_15_XSLTResultTree_8__releasebuffer__(struct __ __pyx_t_1 = ((__pyx_v_self->_buffer_refcnt == 0) != 0); if (__pyx_t_1) { - /* "src/lxml/xslt.pxi":843 + /* "src/lxml/xslt.pxi":838 * self._buffer_refcnt -= 1 * if self._buffer_refcnt == 0: * tree.xmlFree(self._buffer) # <<<<<<<<<<<<<< @@ -189773,7 +189707,7 @@ static void __pyx_pf_4lxml_5etree_15_XSLTResultTree_8__releasebuffer__(struct __ */ xmlFree(((char *)__pyx_v_self->_buffer)); - /* "src/lxml/xslt.pxi":844 + /* "src/lxml/xslt.pxi":839 * if self._buffer_refcnt == 0: * tree.xmlFree(self._buffer) * self._buffer = NULL # <<<<<<<<<<<<<< @@ -189782,7 +189716,7 @@ static void __pyx_pf_4lxml_5etree_15_XSLTResultTree_8__releasebuffer__(struct __ */ __pyx_v_self->_buffer = NULL; - /* "src/lxml/xslt.pxi":842 + /* "src/lxml/xslt.pxi":837 * if buffer.buf is self._buffer: * self._buffer_refcnt -= 1 * if self._buffer_refcnt == 0: # <<<<<<<<<<<<<< @@ -189791,7 +189725,7 @@ static void __pyx_pf_4lxml_5etree_15_XSLTResultTree_8__releasebuffer__(struct __ */ } - /* "src/lxml/xslt.pxi":840 + /* "src/lxml/xslt.pxi":835 * if buffer is NULL: * return * if buffer.buf is self._buffer: # <<<<<<<<<<<<<< @@ -189801,7 +189735,7 @@ static void __pyx_pf_4lxml_5etree_15_XSLTResultTree_8__releasebuffer__(struct __ goto __pyx_L4; } - /* "src/lxml/xslt.pxi":846 + /* "src/lxml/xslt.pxi":841 * self._buffer = NULL * else: * tree.xmlFree(buffer.buf) # <<<<<<<<<<<<<< @@ -189813,7 +189747,7 @@ static void __pyx_pf_4lxml_5etree_15_XSLTResultTree_8__releasebuffer__(struct __ } __pyx_L4:; - /* "src/lxml/xslt.pxi":847 + /* "src/lxml/xslt.pxi":842 * else: * tree.xmlFree(buffer.buf) * buffer.buf = NULL # <<<<<<<<<<<<<< @@ -189822,7 +189756,7 @@ static void __pyx_pf_4lxml_5etree_15_XSLTResultTree_8__releasebuffer__(struct __ */ __pyx_v_buffer->buf = NULL; - /* "src/lxml/xslt.pxi":837 + /* "src/lxml/xslt.pxi":832 * buffer.obj = self * * def __releasebuffer__(self, Py_buffer* buffer): # <<<<<<<<<<<<<< @@ -189835,7 +189769,7 @@ static void __pyx_pf_4lxml_5etree_15_XSLTResultTree_8__releasebuffer__(struct __ __Pyx_RefNannyFinishContext(); } -/* "src/lxml/xslt.pxi":852 +/* "src/lxml/xslt.pxi":847 * """Return an ElementTree with profiling data for the stylesheet run. * """ * def __get__(self): # <<<<<<<<<<<<<< @@ -189867,7 +189801,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_12xslt_profile___get__( PyObject *__pyx_t_5 = NULL; __Pyx_RefNannySetupContext("__get__", 0); - /* "src/lxml/xslt.pxi":854 + /* "src/lxml/xslt.pxi":849 * def __get__(self): * cdef object root * if self._profile is None: # <<<<<<<<<<<<<< @@ -189878,7 +189812,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_12xslt_profile___get__( __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "src/lxml/xslt.pxi":855 + /* "src/lxml/xslt.pxi":850 * cdef object root * if self._profile is None: * return None # <<<<<<<<<<<<<< @@ -189889,7 +189823,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_12xslt_profile___get__( __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; - /* "src/lxml/xslt.pxi":854 + /* "src/lxml/xslt.pxi":849 * def __get__(self): * cdef object root * if self._profile is None: # <<<<<<<<<<<<<< @@ -189898,19 +189832,19 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_12xslt_profile___get__( */ } - /* "src/lxml/xslt.pxi":856 + /* "src/lxml/xslt.pxi":851 * if self._profile is None: * return None * root = self._profile.getroot() # <<<<<<<<<<<<<< * if root is None: * return None */ - __pyx_t_3 = __pyx_f_4lxml_5etree_9_Document_getroot(__pyx_v_self->_profile); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 856, __pyx_L1_error) + __pyx_t_3 = __pyx_f_4lxml_5etree_9_Document_getroot(__pyx_v_self->_profile); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 851, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_v_root = __pyx_t_3; __pyx_t_3 = 0; - /* "src/lxml/xslt.pxi":857 + /* "src/lxml/xslt.pxi":852 * return None * root = self._profile.getroot() * if root is None: # <<<<<<<<<<<<<< @@ -189921,7 +189855,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_12xslt_profile___get__( __pyx_t_1 = (__pyx_t_2 != 0); if (__pyx_t_1) { - /* "src/lxml/xslt.pxi":858 + /* "src/lxml/xslt.pxi":853 * root = self._profile.getroot() * if root is None: * return None # <<<<<<<<<<<<<< @@ -189932,7 +189866,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_12xslt_profile___get__( __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; - /* "src/lxml/xslt.pxi":857 + /* "src/lxml/xslt.pxi":852 * return None * root = self._profile.getroot() * if root is None: # <<<<<<<<<<<<<< @@ -189941,7 +189875,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_12xslt_profile___get__( */ } - /* "src/lxml/xslt.pxi":859 + /* "src/lxml/xslt.pxi":854 * if root is None: * return None * return ElementTree(root) # <<<<<<<<<<<<<< @@ -189949,7 +189883,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_12xslt_profile___get__( * def __del__(self): */ __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_ElementTree); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 859, __pyx_L1_error) + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_ElementTree); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 854, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { @@ -189963,14 +189897,14 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_12xslt_profile___get__( } __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_v_root) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_root); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 859, __pyx_L1_error) + if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 854, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; - /* "src/lxml/xslt.pxi":852 + /* "src/lxml/xslt.pxi":847 * """Return an ElementTree with profiling data for the stylesheet run. * """ * def __get__(self): # <<<<<<<<<<<<<< @@ -189992,7 +189926,7 @@ static PyObject *__pyx_pf_4lxml_5etree_15_XSLTResultTree_12xslt_profile___get__( return __pyx_r; } -/* "src/lxml/xslt.pxi":861 +/* "src/lxml/xslt.pxi":856 * return ElementTree(root) * * def __del__(self): # <<<<<<<<<<<<<< @@ -190018,7 +189952,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_12xslt_profile_2__del__(struc __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__del__", 0); - /* "src/lxml/xslt.pxi":862 + /* "src/lxml/xslt.pxi":857 * * def __del__(self): * self._profile = None # <<<<<<<<<<<<<< @@ -190031,7 +189965,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_12xslt_profile_2__del__(struc __Pyx_DECREF(((PyObject *)__pyx_v_self->_profile)); __pyx_v_self->_profile = ((struct LxmlDocument *)Py_None); - /* "src/lxml/xslt.pxi":861 + /* "src/lxml/xslt.pxi":856 * return ElementTree(root) * * def __del__(self): # <<<<<<<<<<<<<< @@ -190045,7 +189979,7 @@ static int __pyx_pf_4lxml_5etree_15_XSLTResultTree_12xslt_profile_2__del__(struc return __pyx_r; } -/* "src/lxml/xslt.pxi":864 +/* "src/lxml/xslt.pxi":859 * self._profile = None * * cdef _xsltResultTreeFactory(_Document doc, XSLT xslt, _Document profile): # <<<<<<<<<<<<<< @@ -190061,14 +189995,14 @@ static PyObject *__pyx_f_4lxml_5etree__xsltResultTreeFactory(struct LxmlDocument PyObject *__pyx_t_2 = NULL; __Pyx_RefNannySetupContext("_xsltResultTreeFactory", 0); - /* "src/lxml/xslt.pxi":866 + /* "src/lxml/xslt.pxi":861 * cdef _xsltResultTreeFactory(_Document doc, XSLT xslt, _Document profile): * cdef _XSLTResultTree result * result = <_XSLTResultTree>_newElementTree(doc, None, _XSLTResultTree) # <<<<<<<<<<<<<< * result._xslt = xslt * result._profile = profile */ - __pyx_t_1 = ((PyObject *)__pyx_f_4lxml_5etree__newElementTree(__pyx_v_doc, ((struct LxmlElement *)Py_None), ((PyObject *)__pyx_ptype_4lxml_5etree__XSLTResultTree))); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 866, __pyx_L1_error) + __pyx_t_1 = ((PyObject *)__pyx_f_4lxml_5etree__newElementTree(__pyx_v_doc, ((struct LxmlElement *)Py_None), ((PyObject *)__pyx_ptype_4lxml_5etree__XSLTResultTree))); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 861, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __pyx_t_1; __Pyx_INCREF(__pyx_t_2); @@ -190076,7 +190010,7 @@ static PyObject *__pyx_f_4lxml_5etree__xsltResultTreeFactory(struct LxmlDocument __pyx_v_result = ((struct __pyx_obj_4lxml_5etree__XSLTResultTree *)__pyx_t_2); __pyx_t_2 = 0; - /* "src/lxml/xslt.pxi":867 + /* "src/lxml/xslt.pxi":862 * cdef _XSLTResultTree result * result = <_XSLTResultTree>_newElementTree(doc, None, _XSLTResultTree) * result._xslt = xslt # <<<<<<<<<<<<<< @@ -190089,7 +190023,7 @@ static PyObject *__pyx_f_4lxml_5etree__xsltResultTreeFactory(struct LxmlDocument __Pyx_DECREF(((PyObject *)__pyx_v_result->_xslt)); __pyx_v_result->_xslt = __pyx_v_xslt; - /* "src/lxml/xslt.pxi":868 + /* "src/lxml/xslt.pxi":863 * result = <_XSLTResultTree>_newElementTree(doc, None, _XSLTResultTree) * result._xslt = xslt * result._profile = profile # <<<<<<<<<<<<<< @@ -190102,7 +190036,7 @@ static PyObject *__pyx_f_4lxml_5etree__xsltResultTreeFactory(struct LxmlDocument __Pyx_DECREF(((PyObject *)__pyx_v_result->_profile)); __pyx_v_result->_profile = __pyx_v_profile; - /* "src/lxml/xslt.pxi":869 + /* "src/lxml/xslt.pxi":864 * result._xslt = xslt * result._profile = profile * return result # <<<<<<<<<<<<<< @@ -190114,7 +190048,7 @@ static PyObject *__pyx_f_4lxml_5etree__xsltResultTreeFactory(struct LxmlDocument __pyx_r = ((PyObject *)__pyx_v_result); goto __pyx_L0; - /* "src/lxml/xslt.pxi":864 + /* "src/lxml/xslt.pxi":859 * self._profile = None * * cdef _xsltResultTreeFactory(_Document doc, XSLT xslt, _Document profile): # <<<<<<<<<<<<<< @@ -190135,7 +190069,7 @@ static PyObject *__pyx_f_4lxml_5etree__xsltResultTreeFactory(struct LxmlDocument return __pyx_r; } -/* "src/lxml/xslt.pxi":887 +/* "src/lxml/xslt.pxi":882 * cdef XPath __findStylesheetByID = None * * cdef _findStylesheetByID(_Document doc, id): # <<<<<<<<<<<<<< @@ -190153,7 +190087,7 @@ static PyObject *__pyx_f_4lxml_5etree__findStylesheetByID(struct LxmlDocument *_ PyObject *__pyx_t_5 = NULL; __Pyx_RefNannySetupContext("_findStylesheetByID", 0); - /* "src/lxml/xslt.pxi":889 + /* "src/lxml/xslt.pxi":884 * cdef _findStylesheetByID(_Document doc, id): * global __findStylesheetByID * if __findStylesheetByID is None: # <<<<<<<<<<<<<< @@ -190164,29 +190098,29 @@ static PyObject *__pyx_f_4lxml_5etree__findStylesheetByID(struct LxmlDocument *_ __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "src/lxml/xslt.pxi":892 + /* "src/lxml/xslt.pxi":887 * __findStylesheetByID = XPath( * u"//xsl:stylesheet[@xml:id = $id]", * namespaces={u"xsl" : u"http://www.w3.org/1999/XSL/Transform"}) # <<<<<<<<<<<<<< * return __findStylesheetByID(doc, id=id) * */ - __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 892, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 887, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 892, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 887, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - if (PyDict_SetItem(__pyx_t_4, __pyx_n_u_xsl, __pyx_kp_u_http_www_w3_org_1999_XSL_Transfo) < 0) __PYX_ERR(3, 892, __pyx_L1_error) - if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_namespaces, __pyx_t_4) < 0) __PYX_ERR(3, 892, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_4, __pyx_n_u_xsl, __pyx_kp_u_http_www_w3_org_1999_XSL_Transfo) < 0) __PYX_ERR(3, 887, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_namespaces, __pyx_t_4) < 0) __PYX_ERR(3, 887, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "src/lxml/xslt.pxi":890 + /* "src/lxml/xslt.pxi":885 * global __findStylesheetByID * if __findStylesheetByID is None: * __findStylesheetByID = XPath( # <<<<<<<<<<<<<< * u"//xsl:stylesheet[@xml:id = $id]", * namespaces={u"xsl" : u"http://www.w3.org/1999/XSL/Transform"}) */ - __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_4lxml_5etree_XPath), __pyx_tuple__81, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 890, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_4lxml_5etree_XPath), __pyx_tuple__81, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 885, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_XGOTREF(((PyObject *)__pyx_v_4lxml_5etree___findStylesheetByID)); @@ -190194,7 +190128,7 @@ static PyObject *__pyx_f_4lxml_5etree__findStylesheetByID(struct LxmlDocument *_ __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = 0; - /* "src/lxml/xslt.pxi":889 + /* "src/lxml/xslt.pxi":884 * cdef _findStylesheetByID(_Document doc, id): * global __findStylesheetByID * if __findStylesheetByID is None: # <<<<<<<<<<<<<< @@ -190203,7 +190137,7 @@ static PyObject *__pyx_f_4lxml_5etree__findStylesheetByID(struct LxmlDocument *_ */ } - /* "src/lxml/xslt.pxi":893 + /* "src/lxml/xslt.pxi":888 * u"//xsl:stylesheet[@xml:id = $id]", * namespaces={u"xsl" : u"http://www.w3.org/1999/XSL/Transform"}) * return __findStylesheetByID(doc, id=id) # <<<<<<<<<<<<<< @@ -190211,15 +190145,15 @@ static PyObject *__pyx_f_4lxml_5etree__findStylesheetByID(struct LxmlDocument *_ * cdef class _XSLTProcessingInstruction(PIBase): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 893, __pyx_L1_error) + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 888, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(((PyObject *)__pyx_v_doc)); __Pyx_GIVEREF(((PyObject *)__pyx_v_doc)); PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_doc)); - __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 893, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 888, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_id, __pyx_v_id) < 0) __PYX_ERR(3, 893, __pyx_L1_error) - __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)__pyx_v_4lxml_5etree___findStylesheetByID), __pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 893, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_id, __pyx_v_id) < 0) __PYX_ERR(3, 888, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)__pyx_v_4lxml_5etree___findStylesheetByID), __pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 888, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; @@ -190227,7 +190161,7 @@ static PyObject *__pyx_f_4lxml_5etree__findStylesheetByID(struct LxmlDocument *_ __pyx_t_5 = 0; goto __pyx_L0; - /* "src/lxml/xslt.pxi":887 + /* "src/lxml/xslt.pxi":882 * cdef XPath __findStylesheetByID = None * * cdef _findStylesheetByID(_Document doc, id): # <<<<<<<<<<<<<< @@ -190248,7 +190182,7 @@ static PyObject *__pyx_f_4lxml_5etree__findStylesheetByID(struct LxmlDocument *_ return __pyx_r; } -/* "src/lxml/xslt.pxi":896 +/* "src/lxml/xslt.pxi":891 * * cdef class _XSLTProcessingInstruction(PIBase): * def parseXSL(self, parser=None): # <<<<<<<<<<<<<< @@ -190287,7 +190221,7 @@ static PyObject *__pyx_pw_4lxml_5etree_26_XSLTProcessingInstruction_1parseXSL(Py } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "parseXSL") < 0)) __PYX_ERR(3, 896, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "parseXSL") < 0)) __PYX_ERR(3, 891, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -190301,7 +190235,7 @@ static PyObject *__pyx_pw_4lxml_5etree_26_XSLTProcessingInstruction_1parseXSL(Py } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("parseXSL", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(3, 896, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("parseXSL", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(3, 891, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("lxml.etree._XSLTProcessingInstruction.parseXSL", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -190343,16 +190277,16 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str int __pyx_t_17; __Pyx_RefNannySetupContext("parseXSL", 0); - /* "src/lxml/xslt.pxi":912 + /* "src/lxml/xslt.pxi":907 * cdef const_xmlChar* c_href * cdef xmlAttr* c_attr * _assertValidNode(self) # <<<<<<<<<<<<<< * if self._c_node.content is NULL: * raise ValueError, u"PI lacks content" */ - __pyx_t_1 = __pyx_f_4lxml_5etree__assertValidNode(((struct LxmlElement *)__pyx_v_self)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(3, 912, __pyx_L1_error) + __pyx_t_1 = __pyx_f_4lxml_5etree__assertValidNode(((struct LxmlElement *)__pyx_v_self)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(3, 907, __pyx_L1_error) - /* "src/lxml/xslt.pxi":913 + /* "src/lxml/xslt.pxi":908 * cdef xmlAttr* c_attr * _assertValidNode(self) * if self._c_node.content is NULL: # <<<<<<<<<<<<<< @@ -190362,7 +190296,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str __pyx_t_2 = ((__pyx_v_self->__pyx_base.__pyx_base.__pyx_base.__pyx_base._c_node->content == NULL) != 0); if (unlikely(__pyx_t_2)) { - /* "src/lxml/xslt.pxi":914 + /* "src/lxml/xslt.pxi":909 * _assertValidNode(self) * if self._c_node.content is NULL: * raise ValueError, u"PI lacks content" # <<<<<<<<<<<<<< @@ -190370,9 +190304,9 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str * if len(hrefs) != 1: */ __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_u_PI_lacks_content, 0, 0); - __PYX_ERR(3, 914, __pyx_L1_error) + __PYX_ERR(3, 909, __pyx_L1_error) - /* "src/lxml/xslt.pxi":913 + /* "src/lxml/xslt.pxi":908 * cdef xmlAttr* c_attr * _assertValidNode(self) * if self._c_node.content is NULL: # <<<<<<<<<<<<<< @@ -190381,7 +190315,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str */ } - /* "src/lxml/xslt.pxi":915 + /* "src/lxml/xslt.pxi":910 * if self._c_node.content is NULL: * raise ValueError, u"PI lacks content" * hrefs = _FIND_PI_HREF(u' ' + (self._c_node.content).decode('UTF-8')) # <<<<<<<<<<<<<< @@ -190389,9 +190323,9 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str * raise ValueError, u"malformed PI attributes" */ __pyx_t_4 = ((unsigned char *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_base.__pyx_base._c_node->content); - __pyx_t_5 = __Pyx_decode_c_string(((char const *)__pyx_t_4), 0, strlen(((char const *)__pyx_t_4)), NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 915, __pyx_L1_error) + __pyx_t_5 = __Pyx_decode_c_string(((char const *)__pyx_t_4), 0, strlen(((char const *)__pyx_t_4)), NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 910, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = __Pyx_PyUnicode_Concat(__pyx_kp_u__10, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(3, 915, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyUnicode_Concat(__pyx_kp_u__10, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(3, 910, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_INCREF(__pyx_v_4lxml_5etree__FIND_PI_HREF); @@ -190408,24 +190342,24 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str __pyx_t_3 = (__pyx_t_7) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_7, __pyx_t_6) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 915, __pyx_L1_error) + if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 910, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_hrefs = __pyx_t_3; __pyx_t_3 = 0; - /* "src/lxml/xslt.pxi":916 + /* "src/lxml/xslt.pxi":911 * raise ValueError, u"PI lacks content" * hrefs = _FIND_PI_HREF(u' ' + (self._c_node.content).decode('UTF-8')) * if len(hrefs) != 1: # <<<<<<<<<<<<<< * raise ValueError, u"malformed PI attributes" * hrefs = hrefs[0] */ - __pyx_t_8 = PyObject_Length(__pyx_v_hrefs); if (unlikely(__pyx_t_8 == ((Py_ssize_t)-1))) __PYX_ERR(3, 916, __pyx_L1_error) + __pyx_t_8 = PyObject_Length(__pyx_v_hrefs); if (unlikely(__pyx_t_8 == ((Py_ssize_t)-1))) __PYX_ERR(3, 911, __pyx_L1_error) __pyx_t_2 = ((__pyx_t_8 != 1) != 0); if (unlikely(__pyx_t_2)) { - /* "src/lxml/xslt.pxi":917 + /* "src/lxml/xslt.pxi":912 * hrefs = _FIND_PI_HREF(u' ' + (self._c_node.content).decode('UTF-8')) * if len(hrefs) != 1: * raise ValueError, u"malformed PI attributes" # <<<<<<<<<<<<<< @@ -190433,9 +190367,9 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str * href_utf = utf8(hrefs[0] or hrefs[1]) */ __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_u_malformed_PI_attributes, 0, 0); - __PYX_ERR(3, 917, __pyx_L1_error) + __PYX_ERR(3, 912, __pyx_L1_error) - /* "src/lxml/xslt.pxi":916 + /* "src/lxml/xslt.pxi":911 * raise ValueError, u"PI lacks content" * hrefs = _FIND_PI_HREF(u' ' + (self._c_node.content).decode('UTF-8')) * if len(hrefs) != 1: # <<<<<<<<<<<<<< @@ -190444,28 +190378,28 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str */ } - /* "src/lxml/xslt.pxi":918 + /* "src/lxml/xslt.pxi":913 * if len(hrefs) != 1: * raise ValueError, u"malformed PI attributes" * hrefs = hrefs[0] # <<<<<<<<<<<<<< * href_utf = utf8(hrefs[0] or hrefs[1]) * c_href = _xcstr(href_utf) */ - __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_hrefs, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 918, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_hrefs, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 913, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF_SET(__pyx_v_hrefs, __pyx_t_3); __pyx_t_3 = 0; - /* "src/lxml/xslt.pxi":919 + /* "src/lxml/xslt.pxi":914 * raise ValueError, u"malformed PI attributes" * hrefs = hrefs[0] * href_utf = utf8(hrefs[0] or hrefs[1]) # <<<<<<<<<<<<<< * c_href = _xcstr(href_utf) * */ - __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_hrefs, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 919, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_hrefs, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 914, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(3, 919, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(3, 914, __pyx_L1_error) if (!__pyx_t_2) { __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } else { @@ -190474,19 +190408,19 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; goto __pyx_L5_bool_binop_done; } - __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_hrefs, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 919, __pyx_L1_error) + __pyx_t_5 = __Pyx_GetItemInt(__pyx_v_hrefs, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 914, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(__pyx_t_5); __pyx_t_3 = __pyx_t_5; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_L5_bool_binop_done:; - __pyx_t_5 = utf8(__pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 919, __pyx_L1_error) + __pyx_t_5 = utf8(__pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 914, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_href_utf = ((PyObject*)__pyx_t_5); __pyx_t_5 = 0; - /* "src/lxml/xslt.pxi":920 + /* "src/lxml/xslt.pxi":915 * hrefs = hrefs[0] * href_utf = utf8(hrefs[0] or hrefs[1]) * c_href = _xcstr(href_utf) # <<<<<<<<<<<<<< @@ -190495,7 +190429,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str */ __pyx_v_c_href = (const xmlChar*)PyBytes_AS_STRING(__pyx_v_href_utf); - /* "src/lxml/xslt.pxi":922 + /* "src/lxml/xslt.pxi":917 * c_href = _xcstr(href_utf) * * if c_href[0] != c'#': # <<<<<<<<<<<<<< @@ -190505,7 +190439,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str __pyx_t_2 = (((__pyx_v_c_href[0]) != '#') != 0); if (__pyx_t_2) { - /* "src/lxml/xslt.pxi":924 + /* "src/lxml/xslt.pxi":919 * if c_href[0] != c'#': * # normal URL, try to parse from it * c_href = tree.xmlBuildURI( # <<<<<<<<<<<<<< @@ -190514,7 +190448,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str */ __pyx_v_c_href = xmlBuildURI(__pyx_v_c_href, xmlNodeGetBase(__pyx_v_self->__pyx_base.__pyx_base.__pyx_base.__pyx_base._c_node->doc, __pyx_v_self->__pyx_base.__pyx_base.__pyx_base.__pyx_base._c_node)); - /* "src/lxml/xslt.pxi":927 + /* "src/lxml/xslt.pxi":922 * c_href, * tree.xmlNodeGetBase(self._c_node.doc, self._c_node)) * if c_href is not NULL: # <<<<<<<<<<<<<< @@ -190524,7 +190458,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str __pyx_t_2 = ((__pyx_v_c_href != NULL) != 0); if (__pyx_t_2) { - /* "src/lxml/xslt.pxi":928 + /* "src/lxml/xslt.pxi":923 * tree.xmlNodeGetBase(self._c_node.doc, self._c_node)) * if c_href is not NULL: * try: # <<<<<<<<<<<<<< @@ -190533,20 +190467,20 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str */ /*try:*/ { - /* "src/lxml/xslt.pxi":929 + /* "src/lxml/xslt.pxi":924 * if c_href is not NULL: * try: * href_utf = c_href # <<<<<<<<<<<<<< * finally: * tree.xmlFree(c_href) */ - __pyx_t_5 = __Pyx_PyBytes_FromCString(((unsigned char *)__pyx_v_c_href)); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 929, __pyx_L10_error) + __pyx_t_5 = __Pyx_PyBytes_FromCString(((unsigned char *)__pyx_v_c_href)); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 924, __pyx_L10_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF_SET(__pyx_v_href_utf, ((PyObject*)__pyx_t_5)); __pyx_t_5 = 0; } - /* "src/lxml/xslt.pxi":931 + /* "src/lxml/xslt.pxi":926 * href_utf = c_href * finally: * tree.xmlFree(c_href) # <<<<<<<<<<<<<< @@ -190596,7 +190530,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str __pyx_L11:; } - /* "src/lxml/xslt.pxi":927 + /* "src/lxml/xslt.pxi":922 * c_href, * tree.xmlNodeGetBase(self._c_node.doc, self._c_node)) * if c_href is not NULL: # <<<<<<<<<<<<<< @@ -190605,20 +190539,20 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str */ } - /* "src/lxml/xslt.pxi":932 + /* "src/lxml/xslt.pxi":927 * finally: * tree.xmlFree(c_href) * result_doc = _parseDocumentFromURL(href_utf, parser) # <<<<<<<<<<<<<< * return _elementTreeFactory(result_doc, None) * */ - if (!(likely(((__pyx_v_parser) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_parser, __pyx_ptype_4lxml_5etree__BaseParser))))) __PYX_ERR(3, 932, __pyx_L1_error) - __pyx_t_5 = ((PyObject *)__pyx_f_4lxml_5etree__parseDocumentFromURL(__pyx_v_href_utf, ((struct __pyx_obj_4lxml_5etree__BaseParser *)__pyx_v_parser))); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 932, __pyx_L1_error) + if (!(likely(((__pyx_v_parser) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_parser, __pyx_ptype_4lxml_5etree__BaseParser))))) __PYX_ERR(3, 927, __pyx_L1_error) + __pyx_t_5 = ((PyObject *)__pyx_f_4lxml_5etree__parseDocumentFromURL(__pyx_v_href_utf, ((struct __pyx_obj_4lxml_5etree__BaseParser *)__pyx_v_parser))); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 927, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_v_result_doc = ((struct LxmlDocument *)__pyx_t_5); __pyx_t_5 = 0; - /* "src/lxml/xslt.pxi":933 + /* "src/lxml/xslt.pxi":928 * tree.xmlFree(c_href) * result_doc = _parseDocumentFromURL(href_utf, parser) * return _elementTreeFactory(result_doc, None) # <<<<<<<<<<<<<< @@ -190626,13 +190560,13 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str * # ID reference to embedded stylesheet */ __Pyx_XDECREF(__pyx_r); - __pyx_t_5 = ((PyObject *)__pyx_f_4lxml_5etree__elementTreeFactory(__pyx_v_result_doc, ((struct LxmlElement *)Py_None))); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 933, __pyx_L1_error) + __pyx_t_5 = ((PyObject *)__pyx_f_4lxml_5etree__elementTreeFactory(__pyx_v_result_doc, ((struct LxmlElement *)Py_None))); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 928, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; - /* "src/lxml/xslt.pxi":922 + /* "src/lxml/xslt.pxi":917 * c_href = _xcstr(href_utf) * * if c_href[0] != c'#': # <<<<<<<<<<<<<< @@ -190641,7 +190575,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str */ } - /* "src/lxml/xslt.pxi":937 + /* "src/lxml/xslt.pxi":932 * # ID reference to embedded stylesheet * # try XML:ID lookup * _assertValidDoc(self._doc) # <<<<<<<<<<<<<< @@ -190650,10 +190584,10 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str */ __pyx_t_5 = ((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_base.__pyx_base._doc); __Pyx_INCREF(__pyx_t_5); - __pyx_t_9 = __pyx_f_4lxml_5etree__assertValidDoc(((struct LxmlDocument *)__pyx_t_5)); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(3, 937, __pyx_L1_error) + __pyx_t_9 = __pyx_f_4lxml_5etree__assertValidDoc(((struct LxmlDocument *)__pyx_t_5)); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(3, 932, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - /* "src/lxml/xslt.pxi":938 + /* "src/lxml/xslt.pxi":933 * # try XML:ID lookup * _assertValidDoc(self._doc) * c_href += 1 # skip leading '#' # <<<<<<<<<<<<<< @@ -190662,7 +190596,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str */ __pyx_v_c_href = (__pyx_v_c_href + 1); - /* "src/lxml/xslt.pxi":939 + /* "src/lxml/xslt.pxi":934 * _assertValidDoc(self._doc) * c_href += 1 # skip leading '#' * c_attr = tree.xmlGetID(self._c_node.doc, c_href) # <<<<<<<<<<<<<< @@ -190671,7 +190605,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str */ __pyx_v_c_attr = xmlGetID(__pyx_v_self->__pyx_base.__pyx_base.__pyx_base.__pyx_base._c_node->doc, __pyx_v_c_href); - /* "src/lxml/xslt.pxi":940 + /* "src/lxml/xslt.pxi":935 * c_href += 1 # skip leading '#' * c_attr = tree.xmlGetID(self._c_node.doc, c_href) * if c_attr is not NULL and c_attr.doc is self._c_node.doc: # <<<<<<<<<<<<<< @@ -190689,7 +190623,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str __pyx_L15_bool_binop_done:; if (__pyx_t_2) { - /* "src/lxml/xslt.pxi":941 + /* "src/lxml/xslt.pxi":936 * c_attr = tree.xmlGetID(self._c_node.doc, c_href) * if c_attr is not NULL and c_attr.doc is self._c_node.doc: * result_node = _elementFactory(self._doc, c_attr.parent) # <<<<<<<<<<<<<< @@ -190698,13 +190632,13 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str */ __pyx_t_5 = ((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_base.__pyx_base._doc); __Pyx_INCREF(__pyx_t_5); - __pyx_t_3 = ((PyObject *)__pyx_f_4lxml_5etree__elementFactory(((struct LxmlDocument *)__pyx_t_5), __pyx_v_c_attr->parent)); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 941, __pyx_L1_error) + __pyx_t_3 = ((PyObject *)__pyx_f_4lxml_5etree__elementFactory(((struct LxmlDocument *)__pyx_t_5), __pyx_v_c_attr->parent)); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 936, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_result_node = ((struct LxmlElement *)__pyx_t_3); __pyx_t_3 = 0; - /* "src/lxml/xslt.pxi":942 + /* "src/lxml/xslt.pxi":937 * if c_attr is not NULL and c_attr.doc is self._c_node.doc: * result_node = _elementFactory(self._doc, c_attr.parent) * return _elementTreeFactory(result_node._doc, result_node) # <<<<<<<<<<<<<< @@ -190714,14 +190648,14 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str __Pyx_XDECREF(__pyx_r); __pyx_t_3 = ((PyObject *)__pyx_v_result_node->_doc); __Pyx_INCREF(__pyx_t_3); - __pyx_t_5 = ((PyObject *)__pyx_f_4lxml_5etree__elementTreeFactory(((struct LxmlDocument *)__pyx_t_3), __pyx_v_result_node)); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 942, __pyx_L1_error) + __pyx_t_5 = ((PyObject *)__pyx_f_4lxml_5etree__elementTreeFactory(((struct LxmlDocument *)__pyx_t_3), __pyx_v_result_node)); if (unlikely(!__pyx_t_5)) __PYX_ERR(3, 937, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; - /* "src/lxml/xslt.pxi":940 + /* "src/lxml/xslt.pxi":935 * c_href += 1 # skip leading '#' * c_attr = tree.xmlGetID(self._c_node.doc, c_href) * if c_attr is not NULL and c_attr.doc is self._c_node.doc: # <<<<<<<<<<<<<< @@ -190730,7 +190664,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str */ } - /* "src/lxml/xslt.pxi":945 + /* "src/lxml/xslt.pxi":940 * * # try XPath search * root = _findStylesheetByID(self._doc, funicode(c_href)) # <<<<<<<<<<<<<< @@ -190739,27 +190673,27 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str */ __pyx_t_5 = ((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_base.__pyx_base._doc); __Pyx_INCREF(__pyx_t_5); - __pyx_t_3 = __pyx_f_4lxml_5etree_funicode(__pyx_v_c_href); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 945, __pyx_L1_error) + __pyx_t_3 = __pyx_f_4lxml_5etree_funicode(__pyx_v_c_href); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 940, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_6 = __pyx_f_4lxml_5etree__findStylesheetByID(((struct LxmlDocument *)__pyx_t_5), __pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(3, 945, __pyx_L1_error) + __pyx_t_6 = __pyx_f_4lxml_5etree__findStylesheetByID(((struct LxmlDocument *)__pyx_t_5), __pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(3, 940, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_root = __pyx_t_6; __pyx_t_6 = 0; - /* "src/lxml/xslt.pxi":946 + /* "src/lxml/xslt.pxi":941 * # try XPath search * root = _findStylesheetByID(self._doc, funicode(c_href)) * if not root: # <<<<<<<<<<<<<< * raise ValueError, u"reference to non-existing embedded stylesheet" * elif len(root) > 1: */ - __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_root); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(3, 946, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_root); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(3, 941, __pyx_L1_error) __pyx_t_17 = ((!__pyx_t_2) != 0); if (unlikely(__pyx_t_17)) { - /* "src/lxml/xslt.pxi":947 + /* "src/lxml/xslt.pxi":942 * root = _findStylesheetByID(self._doc, funicode(c_href)) * if not root: * raise ValueError, u"reference to non-existing embedded stylesheet" # <<<<<<<<<<<<<< @@ -190767,9 +190701,9 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str * raise ValueError, u"ambiguous reference to embedded stylesheet" */ __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_u_reference_to_non_existing_embedd, 0, 0); - __PYX_ERR(3, 947, __pyx_L1_error) + __PYX_ERR(3, 942, __pyx_L1_error) - /* "src/lxml/xslt.pxi":946 + /* "src/lxml/xslt.pxi":941 * # try XPath search * root = _findStylesheetByID(self._doc, funicode(c_href)) * if not root: # <<<<<<<<<<<<<< @@ -190778,18 +190712,18 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str */ } - /* "src/lxml/xslt.pxi":948 + /* "src/lxml/xslt.pxi":943 * if not root: * raise ValueError, u"reference to non-existing embedded stylesheet" * elif len(root) > 1: # <<<<<<<<<<<<<< * raise ValueError, u"ambiguous reference to embedded stylesheet" * result_node = root[0] */ - __pyx_t_8 = PyObject_Length(__pyx_v_root); if (unlikely(__pyx_t_8 == ((Py_ssize_t)-1))) __PYX_ERR(3, 948, __pyx_L1_error) + __pyx_t_8 = PyObject_Length(__pyx_v_root); if (unlikely(__pyx_t_8 == ((Py_ssize_t)-1))) __PYX_ERR(3, 943, __pyx_L1_error) __pyx_t_17 = ((__pyx_t_8 > 1) != 0); if (unlikely(__pyx_t_17)) { - /* "src/lxml/xslt.pxi":949 + /* "src/lxml/xslt.pxi":944 * raise ValueError, u"reference to non-existing embedded stylesheet" * elif len(root) > 1: * raise ValueError, u"ambiguous reference to embedded stylesheet" # <<<<<<<<<<<<<< @@ -190797,9 +190731,9 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str * return _elementTreeFactory(result_node._doc, result_node) */ __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_u_ambiguous_reference_to_embedded, 0, 0); - __PYX_ERR(3, 949, __pyx_L1_error) + __PYX_ERR(3, 944, __pyx_L1_error) - /* "src/lxml/xslt.pxi":948 + /* "src/lxml/xslt.pxi":943 * if not root: * raise ValueError, u"reference to non-existing embedded stylesheet" * elif len(root) > 1: # <<<<<<<<<<<<<< @@ -190808,20 +190742,20 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str */ } - /* "src/lxml/xslt.pxi":950 + /* "src/lxml/xslt.pxi":945 * elif len(root) > 1: * raise ValueError, u"ambiguous reference to embedded stylesheet" * result_node = root[0] # <<<<<<<<<<<<<< * return _elementTreeFactory(result_node._doc, result_node) * */ - __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_root, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(3, 950, __pyx_L1_error) + __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_root, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(3, 945, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_4lxml_5etree__Element))))) __PYX_ERR(3, 950, __pyx_L1_error) + if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_4lxml_5etree__Element))))) __PYX_ERR(3, 945, __pyx_L1_error) __pyx_v_result_node = ((struct LxmlElement *)__pyx_t_6); __pyx_t_6 = 0; - /* "src/lxml/xslt.pxi":951 + /* "src/lxml/xslt.pxi":946 * raise ValueError, u"ambiguous reference to embedded stylesheet" * result_node = root[0] * return _elementTreeFactory(result_node._doc, result_node) # <<<<<<<<<<<<<< @@ -190831,14 +190765,14 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str __Pyx_XDECREF(__pyx_r); __pyx_t_6 = ((PyObject *)__pyx_v_result_node->_doc); __Pyx_INCREF(__pyx_t_6); - __pyx_t_3 = ((PyObject *)__pyx_f_4lxml_5etree__elementTreeFactory(((struct LxmlDocument *)__pyx_t_6), __pyx_v_result_node)); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 951, __pyx_L1_error) + __pyx_t_3 = ((PyObject *)__pyx_f_4lxml_5etree__elementTreeFactory(((struct LxmlDocument *)__pyx_t_6), __pyx_v_result_node)); if (unlikely(!__pyx_t_3)) __PYX_ERR(3, 946, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; - /* "src/lxml/xslt.pxi":896 + /* "src/lxml/xslt.pxi":891 * * cdef class _XSLTProcessingInstruction(PIBase): * def parseXSL(self, parser=None): # <<<<<<<<<<<<<< @@ -190865,7 +190799,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_parseXSL(str return __pyx_r; } -/* "src/lxml/xslt.pxi":953 +/* "src/lxml/xslt.pxi":948 * return _elementTreeFactory(result_node._doc, result_node) * * def set(self, key, value): # <<<<<<<<<<<<<< @@ -190906,11 +190840,11 @@ static PyObject *__pyx_pw_4lxml_5etree_26_XSLTProcessingInstruction_3set(PyObjec case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_value)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("set", 1, 2, 2, 1); __PYX_ERR(3, 953, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("set", 1, 2, 2, 1); __PYX_ERR(3, 948, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set") < 0)) __PYX_ERR(3, 953, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set") < 0)) __PYX_ERR(3, 948, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -190923,7 +190857,7 @@ static PyObject *__pyx_pw_4lxml_5etree_26_XSLTProcessingInstruction_3set(PyObjec } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("set", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(3, 953, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("set", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(3, 948, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("lxml.etree._XSLTProcessingInstruction.set", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -190953,17 +190887,17 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_2set(struct PyObject *__pyx_t_10 = NULL; __Pyx_RefNannySetupContext("set", 0); - /* "src/lxml/xslt.pxi":959 + /* "src/lxml/xslt.pxi":954 * the processing instruction. * """ * if key != u"href": # <<<<<<<<<<<<<< * raise AttributeError, \ * u"only setting the 'href' attribute is supported on XSLT-PIs" */ - __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_key, __pyx_n_u_href, Py_NE)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(3, 959, __pyx_L1_error) + __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_key, __pyx_n_u_href, Py_NE)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(3, 954, __pyx_L1_error) if (unlikely(__pyx_t_1)) { - /* "src/lxml/xslt.pxi":960 + /* "src/lxml/xslt.pxi":955 * """ * if key != u"href": * raise AttributeError, \ # <<<<<<<<<<<<<< @@ -190971,9 +190905,9 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_2set(struct * if value is None: */ __Pyx_Raise(__pyx_builtin_AttributeError, __pyx_kp_u_only_setting_the_href_attribute, 0, 0); - __PYX_ERR(3, 960, __pyx_L1_error) + __PYX_ERR(3, 955, __pyx_L1_error) - /* "src/lxml/xslt.pxi":959 + /* "src/lxml/xslt.pxi":954 * the processing instruction. * """ * if key != u"href": # <<<<<<<<<<<<<< @@ -190982,7 +190916,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_2set(struct */ } - /* "src/lxml/xslt.pxi":962 + /* "src/lxml/xslt.pxi":957 * raise AttributeError, \ * u"only setting the 'href' attribute is supported on XSLT-PIs" * if value is None: # <<<<<<<<<<<<<< @@ -190993,7 +190927,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_2set(struct __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "src/lxml/xslt.pxi":963 + /* "src/lxml/xslt.pxi":958 * u"only setting the 'href' attribute is supported on XSLT-PIs" * if value is None: * attrib = u"" # <<<<<<<<<<<<<< @@ -191003,7 +190937,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_2set(struct __Pyx_INCREF(__pyx_kp_u__11); __pyx_v_attrib = __pyx_kp_u__11; - /* "src/lxml/xslt.pxi":962 + /* "src/lxml/xslt.pxi":957 * raise AttributeError, \ * u"only setting the 'href' attribute is supported on XSLT-PIs" * if value is None: # <<<<<<<<<<<<<< @@ -191013,27 +190947,27 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_2set(struct goto __pyx_L4; } - /* "src/lxml/xslt.pxi":964 + /* "src/lxml/xslt.pxi":959 * if value is None: * attrib = u"" * elif u'"' in value or u'>' in value: # <<<<<<<<<<<<<< * raise ValueError, u"Invalid URL, must not contain '\"' or '>'" * else: */ - __pyx_t_1 = (__Pyx_PySequence_ContainsTF(__pyx_kp_u__22, __pyx_v_value, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(3, 964, __pyx_L1_error) + __pyx_t_1 = (__Pyx_PySequence_ContainsTF(__pyx_kp_u__22, __pyx_v_value, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(3, 959, __pyx_L1_error) __pyx_t_3 = (__pyx_t_1 != 0); if (!__pyx_t_3) { } else { __pyx_t_2 = __pyx_t_3; goto __pyx_L5_bool_binop_done; } - __pyx_t_3 = (__Pyx_PySequence_ContainsTF(__pyx_kp_u__25, __pyx_v_value, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(3, 964, __pyx_L1_error) + __pyx_t_3 = (__Pyx_PySequence_ContainsTF(__pyx_kp_u__25, __pyx_v_value, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(3, 959, __pyx_L1_error) __pyx_t_1 = (__pyx_t_3 != 0); __pyx_t_2 = __pyx_t_1; __pyx_L5_bool_binop_done:; if (unlikely(__pyx_t_2)) { - /* "src/lxml/xslt.pxi":965 + /* "src/lxml/xslt.pxi":960 * attrib = u"" * elif u'"' in value or u'>' in value: * raise ValueError, u"Invalid URL, must not contain '\"' or '>'" # <<<<<<<<<<<<<< @@ -191041,9 +190975,9 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_2set(struct * attrib = f' href="{value}"' */ __Pyx_Raise(__pyx_builtin_ValueError, __pyx_kp_u_Invalid_URL_must_not_contain_or, 0, 0); - __PYX_ERR(3, 965, __pyx_L1_error) + __PYX_ERR(3, 960, __pyx_L1_error) - /* "src/lxml/xslt.pxi":964 + /* "src/lxml/xslt.pxi":959 * if value is None: * attrib = u"" * elif u'"' in value or u'>' in value: # <<<<<<<<<<<<<< @@ -191052,7 +190986,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_2set(struct */ } - /* "src/lxml/xslt.pxi":967 + /* "src/lxml/xslt.pxi":962 * raise ValueError, u"Invalid URL, must not contain '\"' or '>'" * else: * attrib = f' href="{value}"' # <<<<<<<<<<<<<< @@ -191060,7 +190994,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_2set(struct * if _FIND_PI_HREF(text): */ /*else*/ { - __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 967, __pyx_L1_error) + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 962, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = 0; __pyx_t_6 = 127; @@ -191068,7 +191002,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_2set(struct __pyx_t_5 += 7; __Pyx_GIVEREF(__pyx_kp_u_href_2); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_kp_u_href_2); - __pyx_t_7 = __Pyx_PyObject_FormatSimple(__pyx_v_value, __pyx_empty_unicode); if (unlikely(!__pyx_t_7)) __PYX_ERR(3, 967, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_FormatSimple(__pyx_v_value, __pyx_empty_unicode); if (unlikely(!__pyx_t_7)) __PYX_ERR(3, 962, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_6 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) > __pyx_t_6) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_7) : __pyx_t_6; __pyx_t_5 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_7); @@ -191079,7 +191013,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_2set(struct __pyx_t_5 += 1; __Pyx_GIVEREF(__pyx_kp_u__22); PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_kp_u__22); - __pyx_t_7 = __Pyx_PyUnicode_Join(__pyx_t_4, 3, __pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(3, 967, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyUnicode_Join(__pyx_t_4, 3, __pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(3, 962, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_attrib = ((PyObject*)__pyx_t_7); @@ -191087,22 +191021,22 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_2set(struct } __pyx_L4:; - /* "src/lxml/xslt.pxi":968 + /* "src/lxml/xslt.pxi":963 * else: * attrib = f' href="{value}"' * text = u' ' + self.text # <<<<<<<<<<<<<< * if _FIND_PI_HREF(text): * self.text = _REPLACE_PI_HREF(attrib, text) */ - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_text); if (unlikely(!__pyx_t_7)) __PYX_ERR(3, 968, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_text); if (unlikely(!__pyx_t_7)) __PYX_ERR(3, 963, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); - __pyx_t_4 = PyNumber_Add(__pyx_kp_u__10, __pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 968, __pyx_L1_error) + __pyx_t_4 = PyNumber_Add(__pyx_kp_u__10, __pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 963, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_v_text = __pyx_t_4; __pyx_t_4 = 0; - /* "src/lxml/xslt.pxi":969 + /* "src/lxml/xslt.pxi":964 * attrib = f' href="{value}"' * text = u' ' + self.text * if _FIND_PI_HREF(text): # <<<<<<<<<<<<<< @@ -191122,14 +191056,14 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_2set(struct } __pyx_t_4 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_8, __pyx_v_text) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_v_text); __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 969, __pyx_L1_error) + if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 964, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(3, 969, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(3, 964, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_2) { - /* "src/lxml/xslt.pxi":970 + /* "src/lxml/xslt.pxi":965 * text = u' ' + self.text * if _FIND_PI_HREF(text): * self.text = _REPLACE_PI_HREF(attrib, text) # <<<<<<<<<<<<<< @@ -191152,7 +191086,7 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_2set(struct #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_7)) { PyObject *__pyx_temp[3] = {__pyx_t_8, __pyx_v_attrib, __pyx_v_text}; - __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_9, 2+__pyx_t_9); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 970, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_9, 2+__pyx_t_9); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 965, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_GOTREF(__pyx_t_4); } else @@ -191160,13 +191094,13 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_2set(struct #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { PyObject *__pyx_temp[3] = {__pyx_t_8, __pyx_v_attrib, __pyx_v_text}; - __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_9, 2+__pyx_t_9); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 970, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_9, 2+__pyx_t_9); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 965, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_GOTREF(__pyx_t_4); } else #endif { - __pyx_t_10 = PyTuple_New(2+__pyx_t_9); if (unlikely(!__pyx_t_10)) __PYX_ERR(3, 970, __pyx_L1_error) + __pyx_t_10 = PyTuple_New(2+__pyx_t_9); if (unlikely(!__pyx_t_10)) __PYX_ERR(3, 965, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); if (__pyx_t_8) { __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_8); __pyx_t_8 = NULL; @@ -191177,15 +191111,15 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_2set(struct __Pyx_INCREF(__pyx_v_text); __Pyx_GIVEREF(__pyx_v_text); PyTuple_SET_ITEM(__pyx_t_10, 1+__pyx_t_9, __pyx_v_text); - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_10, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 970, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_10, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 965, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; } __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - if (__Pyx_PyObject_SetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_text, __pyx_t_4) < 0) __PYX_ERR(3, 970, __pyx_L1_error) + if (__Pyx_PyObject_SetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_text, __pyx_t_4) < 0) __PYX_ERR(3, 965, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "src/lxml/xslt.pxi":969 + /* "src/lxml/xslt.pxi":964 * attrib = f' href="{value}"' * text = u' ' + self.text * if _FIND_PI_HREF(text): # <<<<<<<<<<<<<< @@ -191195,20 +191129,20 @@ static PyObject *__pyx_pf_4lxml_5etree_26_XSLTProcessingInstruction_2set(struct goto __pyx_L7; } - /* "src/lxml/xslt.pxi":972 + /* "src/lxml/xslt.pxi":967 * self.text = _REPLACE_PI_HREF(attrib, text) * else: * self.text = text + attrib # <<<<<<<<<<<<<< */ /*else*/ { - __pyx_t_4 = PyNumber_Add(__pyx_v_text, __pyx_v_attrib); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 972, __pyx_L1_error) + __pyx_t_4 = PyNumber_Add(__pyx_v_text, __pyx_v_attrib); if (unlikely(!__pyx_t_4)) __PYX_ERR(3, 967, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - if (__Pyx_PyObject_SetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_text, __pyx_t_4) < 0) __PYX_ERR(3, 972, __pyx_L1_error) + if (__Pyx_PyObject_SetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_text, __pyx_t_4) < 0) __PYX_ERR(3, 967, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __pyx_L7:; - /* "src/lxml/xslt.pxi":953 + /* "src/lxml/xslt.pxi":948 * return _elementTreeFactory(result_node._doc, result_node) * * def set(self, key, value): # <<<<<<<<<<<<<< @@ -226428,7 +226362,6 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_c_dtd, __pyx_k_c_dtd, sizeof(__pyx_k_c_dtd), 0, 0, 1, 1}, {&__pyx_n_s_c_element, __pyx_k_c_element, sizeof(__pyx_k_c_element), 0, 0, 1, 1}, {&__pyx_n_s_c_encoding, __pyx_k_c_encoding, sizeof(__pyx_k_c_encoding), 0, 0, 1, 1}, - {&__pyx_n_s_c_filename, __pyx_k_c_filename, sizeof(__pyx_k_c_filename), 0, 0, 1, 1}, {&__pyx_n_s_c_href, __pyx_k_c_href, sizeof(__pyx_k_c_href), 0, 0, 1, 1}, {&__pyx_n_s_c_method, __pyx_k_c_method, sizeof(__pyx_k_c_method), 0, 0, 1, 1}, {&__pyx_n_s_c_name, __pyx_k_c_name, sizeof(__pyx_k_c_name), 0, 0, 1, 1}, @@ -226597,7 +226530,6 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_feed_error_log, __pyx_k_feed_error_log, sizeof(__pyx_k_feed_error_log), 0, 0, 1, 1}, {&__pyx_n_s_file, __pyx_k_file, sizeof(__pyx_k_file), 0, 0, 1, 1}, {&__pyx_kp_u_file_must_be_a_filename_or_file, __pyx_k_file_must_be_a_filename_or_file, sizeof(__pyx_k_file_must_be_a_filename_or_file), 0, 1, 0, 0}, - {&__pyx_n_s_file_path, __pyx_k_file_path, sizeof(__pyx_k_file_path), 0, 0, 1, 1}, {&__pyx_n_s_filelike, __pyx_k_filelike, sizeof(__pyx_k_filelike), 0, 0, 1, 1}, {&__pyx_n_s_filename, __pyx_k_filename, sizeof(__pyx_k_filename), 0, 0, 1, 1}, {&__pyx_n_s_fileobj, __pyx_k_fileobj, sizeof(__pyx_k_fileobj), 0, 0, 1, 1}, @@ -226883,6 +226815,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_raise_on_error, __pyx_k_raise_on_error, sizeof(__pyx_k_raise_on_error), 0, 0, 1, 1}, {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, {&__pyx_n_s_rb, __pyx_k_rb, sizeof(__pyx_k_rb), 0, 0, 1, 1}, + {&__pyx_n_s_rclose, __pyx_k_rclose, sizeof(__pyx_k_rclose), 0, 0, 1, 1}, {&__pyx_n_b_rdf, __pyx_k_rdf, sizeof(__pyx_k_rdf), 0, 0, 0, 1}, {&__pyx_n_s_re, __pyx_k_re, sizeof(__pyx_k_re), 0, 0, 1, 1}, {&__pyx_n_s_read, __pyx_k_read, sizeof(__pyx_k_read), 0, 0, 1, 1}, @@ -227587,14 +227520,14 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__80); __Pyx_GIVEREF(__pyx_tuple__80); - /* "src/lxml/xslt.pxi":890 + /* "src/lxml/xslt.pxi":885 * global __findStylesheetByID * if __findStylesheetByID is None: * __findStylesheetByID = XPath( # <<<<<<<<<<<<<< * u"//xsl:stylesheet[@xml:id = $id]", * namespaces={u"xsl" : u"http://www.w3.org/1999/XSL/Transform"}) */ - __pyx_tuple__81 = PyTuple_Pack(1, __pyx_kp_u_xsl_stylesheet_xml_id_id); if (unlikely(!__pyx_tuple__81)) __PYX_ERR(3, 890, __pyx_L1_error) + __pyx_tuple__81 = PyTuple_Pack(1, __pyx_kp_u_xsl_stylesheet_xml_id_id); if (unlikely(!__pyx_tuple__81)) __PYX_ERR(3, 885, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__81); __Pyx_GIVEREF(__pyx_tuple__81); @@ -230725,57 +230658,57 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * """write_output(self, file, *, compression=0) * */ - __pyx_tuple__593 = PyTuple_Pack(11, __pyx_n_s_self, __pyx_n_s_file, __pyx_n_s_compression, __pyx_n_s_writer, __pyx_n_s_doc_2, __pyx_n_s_r, __pyx_n_s_c_compression, __pyx_n_s_c_encoding, __pyx_n_s_c_buffer, __pyx_n_s_file_path, __pyx_n_s_c_filename); if (unlikely(!__pyx_tuple__593)) __PYX_ERR(3, 713, __pyx_L1_error) + __pyx_tuple__593 = PyTuple_Pack(10, __pyx_n_s_self, __pyx_n_s_file, __pyx_n_s_compression, __pyx_n_s_writer, __pyx_n_s_doc_2, __pyx_n_s_r, __pyx_n_s_rclose, __pyx_n_s_c_compression, __pyx_n_s_c_encoding, __pyx_n_s_c_buffer); if (unlikely(!__pyx_tuple__593)) __PYX_ERR(3, 713, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__593); __Pyx_GIVEREF(__pyx_tuple__593); - __pyx_codeobj__594 = (PyObject*)__Pyx_PyCode_New(2, 1, 11, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__593, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_lxml_xslt_pxi, __pyx_n_s_write_output, 713, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__594)) __PYX_ERR(3, 713, __pyx_L1_error) + __pyx_codeobj__594 = (PyObject*)__Pyx_PyCode_New(2, 1, 10, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__593, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_lxml_xslt_pxi, __pyx_n_s_write_output, 713, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__594)) __PYX_ERR(3, 713, __pyx_L1_error) - /* "src/lxml/xslt.pxi":788 + /* "src/lxml/xslt.pxi":783 * return result * * def __unicode__(self): # <<<<<<<<<<<<<< * cdef xmlChar* encoding * cdef xmlChar* s = NULL */ - __pyx_tuple__595 = PyTuple_Pack(5, __pyx_n_s_self, __pyx_n_s_encoding, __pyx_n_s_s_4, __pyx_n_s_l, __pyx_n_s_result); if (unlikely(!__pyx_tuple__595)) __PYX_ERR(3, 788, __pyx_L1_error) + __pyx_tuple__595 = PyTuple_Pack(5, __pyx_n_s_self, __pyx_n_s_encoding, __pyx_n_s_s_4, __pyx_n_s_l, __pyx_n_s_result); if (unlikely(!__pyx_tuple__595)) __PYX_ERR(3, 783, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__595); __Pyx_GIVEREF(__pyx_tuple__595); - __pyx_codeobj__596 = (PyObject*)__Pyx_PyCode_New(1, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__595, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_lxml_xslt_pxi, __pyx_n_s_unicode_2, 788, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__596)) __PYX_ERR(3, 788, __pyx_L1_error) + __pyx_codeobj__596 = (PyObject*)__Pyx_PyCode_New(1, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__595, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_lxml_xslt_pxi, __pyx_n_s_unicode_2, 783, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__596)) __PYX_ERR(3, 783, __pyx_L1_error) - /* "src/lxml/xslt.pxi":882 + /* "src/lxml/xslt.pxi":877 * # XSLT PI support * * cdef object _RE_PI_HREF = re.compile(ur'\s+href\s*=\s*(?:\'([^\']*)\'|"([^"]*)")') # <<<<<<<<<<<<<< * cdef object _FIND_PI_HREF = _RE_PI_HREF.findall * cdef object _REPLACE_PI_HREF = _RE_PI_HREF.sub */ - __pyx_tuple__597 = PyTuple_Pack(1, __pyx_kp_u_s_href_s_s); if (unlikely(!__pyx_tuple__597)) __PYX_ERR(3, 882, __pyx_L1_error) + __pyx_tuple__597 = PyTuple_Pack(1, __pyx_kp_u_s_href_s_s); if (unlikely(!__pyx_tuple__597)) __PYX_ERR(3, 877, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__597); __Pyx_GIVEREF(__pyx_tuple__597); - /* "src/lxml/xslt.pxi":896 + /* "src/lxml/xslt.pxi":891 * * cdef class _XSLTProcessingInstruction(PIBase): * def parseXSL(self, parser=None): # <<<<<<<<<<<<<< * u"""parseXSL(self, parser=None) * */ - __pyx_tuple__598 = PyTuple_Pack(9, __pyx_n_s_self, __pyx_n_s_parser, __pyx_n_s_result_doc, __pyx_n_s_result_node, __pyx_n_s_href_utf, __pyx_n_s_c_href, __pyx_n_s_c_attr, __pyx_n_s_hrefs, __pyx_n_s_root); if (unlikely(!__pyx_tuple__598)) __PYX_ERR(3, 896, __pyx_L1_error) + __pyx_tuple__598 = PyTuple_Pack(9, __pyx_n_s_self, __pyx_n_s_parser, __pyx_n_s_result_doc, __pyx_n_s_result_node, __pyx_n_s_href_utf, __pyx_n_s_c_href, __pyx_n_s_c_attr, __pyx_n_s_hrefs, __pyx_n_s_root); if (unlikely(!__pyx_tuple__598)) __PYX_ERR(3, 891, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__598); __Pyx_GIVEREF(__pyx_tuple__598); - __pyx_codeobj__599 = (PyObject*)__Pyx_PyCode_New(2, 0, 9, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__598, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_lxml_xslt_pxi, __pyx_n_s_parseXSL, 896, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__599)) __PYX_ERR(3, 896, __pyx_L1_error) + __pyx_codeobj__599 = (PyObject*)__Pyx_PyCode_New(2, 0, 9, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__598, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_lxml_xslt_pxi, __pyx_n_s_parseXSL, 891, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__599)) __PYX_ERR(3, 891, __pyx_L1_error) - /* "src/lxml/xslt.pxi":953 + /* "src/lxml/xslt.pxi":948 * return _elementTreeFactory(result_node._doc, result_node) * * def set(self, key, value): # <<<<<<<<<<<<<< * u"""set(self, key, value) * */ - __pyx_tuple__600 = PyTuple_Pack(5, __pyx_n_s_self, __pyx_n_s_key, __pyx_n_s_value, __pyx_n_s_attrib, __pyx_n_s_text); if (unlikely(!__pyx_tuple__600)) __PYX_ERR(3, 953, __pyx_L1_error) + __pyx_tuple__600 = PyTuple_Pack(5, __pyx_n_s_self, __pyx_n_s_key, __pyx_n_s_value, __pyx_n_s_attrib, __pyx_n_s_text); if (unlikely(!__pyx_tuple__600)) __PYX_ERR(3, 948, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__600); __Pyx_GIVEREF(__pyx_tuple__600); - __pyx_codeobj__601 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__600, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_lxml_xslt_pxi, __pyx_n_s_set, 953, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__601)) __PYX_ERR(3, 953, __pyx_L1_error) + __pyx_codeobj__601 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__600, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_lxml_xslt_pxi, __pyx_n_s_set, 948, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__601)) __PYX_ERR(3, 948, __pyx_L1_error) /* "src/lxml/xsltext.pxi":6 * u"""Base class of an XSLT extension element. @@ -232704,13 +232637,13 @@ static int __Pyx_modinit_type_init_code(void) { __pyx_vtabptr_4lxml_5etree__XSLTProcessingInstruction = &__pyx_vtable_4lxml_5etree__XSLTProcessingInstruction; __pyx_vtable_4lxml_5etree__XSLTProcessingInstruction.__pyx_base = *__pyx_vtabptr_4lxml_5etree_PIBase; __pyx_type_4lxml_5etree__XSLTProcessingInstruction.tp_base = __pyx_ptype_4lxml_5etree_PIBase; - if (PyType_Ready(&__pyx_type_4lxml_5etree__XSLTProcessingInstruction) < 0) __PYX_ERR(3, 895, __pyx_L1_error) + if (PyType_Ready(&__pyx_type_4lxml_5etree__XSLTProcessingInstruction) < 0) __PYX_ERR(3, 890, __pyx_L1_error) __pyx_type_4lxml_5etree__XSLTProcessingInstruction.tp_print = 0; if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_4lxml_5etree__XSLTProcessingInstruction.tp_dictoffset && __pyx_type_4lxml_5etree__XSLTProcessingInstruction.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type_4lxml_5etree__XSLTProcessingInstruction.tp_getattro = __Pyx_PyObject_GenericGetAttr; } - if (__Pyx_SetVtable(__pyx_type_4lxml_5etree__XSLTProcessingInstruction.tp_dict, __pyx_vtabptr_4lxml_5etree__XSLTProcessingInstruction) < 0) __PYX_ERR(3, 895, __pyx_L1_error) - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_XSLTProcessingInstruction, (PyObject *)&__pyx_type_4lxml_5etree__XSLTProcessingInstruction) < 0) __PYX_ERR(3, 895, __pyx_L1_error) + if (__Pyx_SetVtable(__pyx_type_4lxml_5etree__XSLTProcessingInstruction.tp_dict, __pyx_vtabptr_4lxml_5etree__XSLTProcessingInstruction) < 0) __PYX_ERR(3, 890, __pyx_L1_error) + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_XSLTProcessingInstruction, (PyObject *)&__pyx_type_4lxml_5etree__XSLTProcessingInstruction) < 0) __PYX_ERR(3, 890, __pyx_L1_error) __pyx_ptype_4lxml_5etree__XSLTProcessingInstruction = &__pyx_type_4lxml_5etree__XSLTProcessingInstruction; __pyx_vtabptr_4lxml_5etree_XSLTExtension = &__pyx_vtable_4lxml_5etree_XSLTExtension; __pyx_vtable_4lxml_5etree_XSLTExtension._collectXSLTResultContent = (PyObject *(*)(struct __pyx_obj_4lxml_5etree_XSLTExtension *, struct __pyx_obj_4lxml_5etree__XSLTContext *, xmlNode *, int, int))__pyx_f_4lxml_5etree_13XSLTExtension__collectXSLTResultContent; @@ -239077,20 +239010,20 @@ if (!__Pyx_RefNanny) { __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; PyType_Modified(__pyx_ptype_4lxml_5etree__XSLTResultTree); - /* "src/lxml/xslt.pxi":788 + /* "src/lxml/xslt.pxi":783 * return result * * def __unicode__(self): # <<<<<<<<<<<<<< * cdef xmlChar* encoding * cdef xmlChar* s = NULL */ - __pyx_t_14 = __Pyx_CyFunction_NewEx(&__pyx_mdef_4lxml_5etree_15_XSLTResultTree_5__unicode__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_XSLTResultTree___unicode, NULL, __pyx_n_s_lxml_etree, __pyx_d, ((PyObject *)__pyx_codeobj__596)); if (unlikely(!__pyx_t_14)) __PYX_ERR(3, 788, __pyx_L1_error) + __pyx_t_14 = __Pyx_CyFunction_NewEx(&__pyx_mdef_4lxml_5etree_15_XSLTResultTree_5__unicode__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_XSLTResultTree___unicode, NULL, __pyx_n_s_lxml_etree, __pyx_d, ((PyObject *)__pyx_codeobj__596)); if (unlikely(!__pyx_t_14)) __PYX_ERR(3, 783, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_14); - if (PyDict_SetItem((PyObject *)__pyx_ptype_4lxml_5etree__XSLTResultTree->tp_dict, __pyx_n_s_unicode_2, __pyx_t_14) < 0) __PYX_ERR(3, 788, __pyx_L1_error) + if (PyDict_SetItem((PyObject *)__pyx_ptype_4lxml_5etree__XSLTResultTree->tp_dict, __pyx_n_s_unicode_2, __pyx_t_14) < 0) __PYX_ERR(3, 783, __pyx_L1_error) __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; PyType_Modified(__pyx_ptype_4lxml_5etree__XSLTResultTree); - /* "src/lxml/xslt.pxi":873 + /* "src/lxml/xslt.pxi":868 * # functions like "output" and "write" are a potential security risk, but we * # rely on the user to configure XSLTAccessControl as needed * xslt.xsltRegisterAllExtras() # <<<<<<<<<<<<<< @@ -239099,7 +239032,7 @@ if (!__Pyx_RefNanny) { */ xsltRegisterAllExtras(); - /* "src/lxml/xslt.pxi":876 + /* "src/lxml/xslt.pxi":871 * * # enable EXSLT support for XSLT * xslt.exsltRegisterAll() # <<<<<<<<<<<<<< @@ -239108,16 +239041,16 @@ if (!__Pyx_RefNanny) { */ exsltRegisterAll(); - /* "src/lxml/xslt.pxi":882 + /* "src/lxml/xslt.pxi":877 * # XSLT PI support * * cdef object _RE_PI_HREF = re.compile(ur'\s+href\s*=\s*(?:\'([^\']*)\'|"([^"]*)")') # <<<<<<<<<<<<<< * cdef object _FIND_PI_HREF = _RE_PI_HREF.findall * cdef object _REPLACE_PI_HREF = _RE_PI_HREF.sub */ - __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_4lxml_5etree_re, __pyx_n_s_compile); if (unlikely(!__pyx_t_14)) __PYX_ERR(3, 882, __pyx_L1_error) + __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_v_4lxml_5etree_re, __pyx_n_s_compile); if (unlikely(!__pyx_t_14)) __PYX_ERR(3, 877, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_14); - __pyx_t_15 = __Pyx_PyObject_Call(__pyx_t_14, __pyx_tuple__597, NULL); if (unlikely(!__pyx_t_15)) __PYX_ERR(3, 882, __pyx_L1_error) + __pyx_t_15 = __Pyx_PyObject_Call(__pyx_t_14, __pyx_tuple__597, NULL); if (unlikely(!__pyx_t_15)) __PYX_ERR(3, 877, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_15); __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; __Pyx_XGOTREF(__pyx_v_4lxml_5etree__RE_PI_HREF); @@ -239125,35 +239058,35 @@ if (!__Pyx_RefNanny) { __Pyx_GIVEREF(__pyx_t_15); __pyx_t_15 = 0; - /* "src/lxml/xslt.pxi":883 + /* "src/lxml/xslt.pxi":878 * * cdef object _RE_PI_HREF = re.compile(ur'\s+href\s*=\s*(?:\'([^\']*)\'|"([^"]*)")') * cdef object _FIND_PI_HREF = _RE_PI_HREF.findall # <<<<<<<<<<<<<< * cdef object _REPLACE_PI_HREF = _RE_PI_HREF.sub * cdef XPath __findStylesheetByID = None */ - __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_v_4lxml_5etree__RE_PI_HREF, __pyx_n_s_findall); if (unlikely(!__pyx_t_15)) __PYX_ERR(3, 883, __pyx_L1_error) + __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_v_4lxml_5etree__RE_PI_HREF, __pyx_n_s_findall); if (unlikely(!__pyx_t_15)) __PYX_ERR(3, 878, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_15); __Pyx_XGOTREF(__pyx_v_4lxml_5etree__FIND_PI_HREF); __Pyx_DECREF_SET(__pyx_v_4lxml_5etree__FIND_PI_HREF, __pyx_t_15); __Pyx_GIVEREF(__pyx_t_15); __pyx_t_15 = 0; - /* "src/lxml/xslt.pxi":884 + /* "src/lxml/xslt.pxi":879 * cdef object _RE_PI_HREF = re.compile(ur'\s+href\s*=\s*(?:\'([^\']*)\'|"([^"]*)")') * cdef object _FIND_PI_HREF = _RE_PI_HREF.findall * cdef object _REPLACE_PI_HREF = _RE_PI_HREF.sub # <<<<<<<<<<<<<< * cdef XPath __findStylesheetByID = None * */ - __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_v_4lxml_5etree__RE_PI_HREF, __pyx_n_s_sub); if (unlikely(!__pyx_t_15)) __PYX_ERR(3, 884, __pyx_L1_error) + __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_v_4lxml_5etree__RE_PI_HREF, __pyx_n_s_sub); if (unlikely(!__pyx_t_15)) __PYX_ERR(3, 879, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_15); __Pyx_XGOTREF(__pyx_v_4lxml_5etree__REPLACE_PI_HREF); __Pyx_DECREF_SET(__pyx_v_4lxml_5etree__REPLACE_PI_HREF, __pyx_t_15); __Pyx_GIVEREF(__pyx_t_15); __pyx_t_15 = 0; - /* "src/lxml/xslt.pxi":885 + /* "src/lxml/xslt.pxi":880 * cdef object _FIND_PI_HREF = _RE_PI_HREF.findall * cdef object _REPLACE_PI_HREF = _RE_PI_HREF.sub * cdef XPath __findStylesheetByID = None # <<<<<<<<<<<<<< @@ -239165,29 +239098,29 @@ if (!__Pyx_RefNanny) { __Pyx_DECREF_SET(__pyx_v_4lxml_5etree___findStylesheetByID, ((struct __pyx_obj_4lxml_5etree_XPath *)Py_None)); __Pyx_GIVEREF(Py_None); - /* "src/lxml/xslt.pxi":896 + /* "src/lxml/xslt.pxi":891 * * cdef class _XSLTProcessingInstruction(PIBase): * def parseXSL(self, parser=None): # <<<<<<<<<<<<<< * u"""parseXSL(self, parser=None) * */ - __pyx_t_15 = __Pyx_CyFunction_NewEx(&__pyx_mdef_4lxml_5etree_26_XSLTProcessingInstruction_1parseXSL, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_XSLTProcessingInstruction_parse, NULL, __pyx_n_s_lxml_etree, __pyx_d, ((PyObject *)__pyx_codeobj__599)); if (unlikely(!__pyx_t_15)) __PYX_ERR(3, 896, __pyx_L1_error) + __pyx_t_15 = __Pyx_CyFunction_NewEx(&__pyx_mdef_4lxml_5etree_26_XSLTProcessingInstruction_1parseXSL, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_XSLTProcessingInstruction_parse, NULL, __pyx_n_s_lxml_etree, __pyx_d, ((PyObject *)__pyx_codeobj__599)); if (unlikely(!__pyx_t_15)) __PYX_ERR(3, 891, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_15); - if (PyDict_SetItem((PyObject *)__pyx_ptype_4lxml_5etree__XSLTProcessingInstruction->tp_dict, __pyx_n_s_parseXSL, __pyx_t_15) < 0) __PYX_ERR(3, 896, __pyx_L1_error) + if (PyDict_SetItem((PyObject *)__pyx_ptype_4lxml_5etree__XSLTProcessingInstruction->tp_dict, __pyx_n_s_parseXSL, __pyx_t_15) < 0) __PYX_ERR(3, 891, __pyx_L1_error) __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; PyType_Modified(__pyx_ptype_4lxml_5etree__XSLTProcessingInstruction); - /* "src/lxml/xslt.pxi":953 + /* "src/lxml/xslt.pxi":948 * return _elementTreeFactory(result_node._doc, result_node) * * def set(self, key, value): # <<<<<<<<<<<<<< * u"""set(self, key, value) * */ - __pyx_t_15 = __Pyx_CyFunction_NewEx(&__pyx_mdef_4lxml_5etree_26_XSLTProcessingInstruction_3set, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_XSLTProcessingInstruction_set, NULL, __pyx_n_s_lxml_etree, __pyx_d, ((PyObject *)__pyx_codeobj__601)); if (unlikely(!__pyx_t_15)) __PYX_ERR(3, 953, __pyx_L1_error) + __pyx_t_15 = __Pyx_CyFunction_NewEx(&__pyx_mdef_4lxml_5etree_26_XSLTProcessingInstruction_3set, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_XSLTProcessingInstruction_set, NULL, __pyx_n_s_lxml_etree, __pyx_d, ((PyObject *)__pyx_codeobj__601)); if (unlikely(!__pyx_t_15)) __PYX_ERR(3, 948, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_15); - if (PyDict_SetItem((PyObject *)__pyx_ptype_4lxml_5etree__XSLTProcessingInstruction->tp_dict, __pyx_n_s_set, __pyx_t_15) < 0) __PYX_ERR(3, 953, __pyx_L1_error) + if (PyDict_SetItem((PyObject *)__pyx_ptype_4lxml_5etree__XSLTProcessingInstruction->tp_dict, __pyx_n_s_set, __pyx_t_15) < 0) __PYX_ERR(3, 948, __pyx_L1_error) __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; PyType_Modified(__pyx_ptype_4lxml_5etree__XSLTProcessingInstruction); diff --git a/src/lxml/includes/lxml-version.h b/src/lxml/includes/lxml-version.h index 3aac4231..6ba1a3df 100644 --- a/src/lxml/includes/lxml-version.h +++ b/src/lxml/includes/lxml-version.h @@ -1,3 +1,3 @@ #ifndef LXML_VERSION_STRING -#define LXML_VERSION_STRING "4.3.2" +#define LXML_VERSION_STRING "4.3.3" #endif diff --git a/src/lxml/xslt.pxi b/src/lxml/xslt.pxi index d63a65ea..ee7b0719 100644 --- a/src/lxml/xslt.pxi +++ b/src/lxml/xslt.pxi @@ -720,7 +720,7 @@ cdef class _XSLTResultTree(_ElementTree): """ cdef _FilelikeWriter writer = None cdef _Document doc - cdef int r, c_compression + cdef int r, rclose, c_compression cdef const_xmlChar* c_encoding = NULL cdef tree.xmlOutputBuffer* c_buffer @@ -733,23 +733,18 @@ cdef class _XSLTResultTree(_ElementTree): if doc is None: raise XSLTSaveError("No document to serialise") c_compression = compression or 0 - if _isString(file): - file_path = _encodeFilename(file) - c_filename = _cstr(file_path) + xslt.LXML_GET_XSLT_ENCODING(c_encoding, self._xslt._c_style) + writer = _create_output_buffer(file, c_encoding, compression, &c_buffer, close=False) + if writer is None: with nogil: - r = xslt.xsltSaveResultToFilename( - c_filename, doc._c_doc, self._xslt._c_style, c_compression) - else: - xslt.LXML_GET_XSLT_ENCODING(c_encoding, self._xslt._c_style) - writer = _create_output_buffer(file, c_encoding, compression, &c_buffer, close=False) - if writer is None: - with nogil: - r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) - else: r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) + rclose = tree.xmlOutputBufferClose(c_buffer) + else: + r = xslt.xsltSaveResultTo(c_buffer, doc._c_doc, self._xslt._c_style) + rclose = tree.xmlOutputBufferClose(c_buffer) if writer is not None: writer._exc_context._raise_if_stored() - if r == -1: + if r < 0 or rclose < 0: python.PyErr_SetFromErrno(XSLTSaveError) # raises cdef _saveToStringAndSize(self, xmlChar** s, int* l): diff --git a/version.txt b/version.txt index cc2fbe89..e91d9be2 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -4.3.2 +4.3.3