From: Hyunjee Kim Date: Thu, 31 Jan 2019 02:00:34 +0000 (+0900) Subject: Imported Upstream version 3.7.3 X-Git-Tag: upstream/4.3.0~11 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8a958e57193fb7df7e2a269856f80d4eed7a4a10;p=platform%2Fupstream%2Fpython-lxml.git Imported Upstream version 3.7.3 Change-Id: I8f433f572c725c4edb7c5fbb8379c2e010722b23 Signed-off-by: Hyunjee Kim --- diff --git a/CHANGES.txt b/CHANGES.txt index 573adc5d..029b64a1 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -2,9 +2,24 @@ lxml changelog ============== +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 ---------- @@ -1195,7 +1210,7 @@ Bugs fixed previously worked in 2.3.1. * Fixed parsing of some selectors in cssselect. Whitespace after combinators - ">", "+" and "~" is now correctly ignored. Previously is was parsed as + ">", "+" 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. @@ -2892,7 +2907,7 @@ Features added * ``ElementMaker`` XML generator by Fredrik Lundh in ``lxml.builder.E`` -* Support for pickeling ``objectify.ObjectifiedElement`` objects to XML +* Support for pickling ``objectify.ObjectifiedElement`` objects to XML * ``update()`` method on Element.attrib diff --git a/PKG-INFO b/PKG-INFO index d876caa7..22b03bea 100644 --- a/PKG-INFO +++ b/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: lxml -Version: 3.7.2 +Version: 3.7.3 Summary: Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. Home-page: http://lxml.de/ Author: lxml dev team @@ -36,20 +36,16 @@ 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. - 3.7.2 (2017-01-08) + 3.7.3 (2017-02-18) ================== Bugs fixed ---------- - * Work around installation problems in recent Python 2.7 versions - due to FTP download failures. + * GH#218 was ineffective in Python 3. - * 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. + * GH#222: ``lxml.html.submit_form()`` failed in Python 3. + Patch by Jakub Wilk. diff --git a/buildlibxml.py b/buildlibxml.py index bbdf62b0..5b32034c 100644 --- a/buildlibxml.py +++ b/buildlibxml.py @@ -57,6 +57,7 @@ def download_and_extract_zlatkovic_binaries(destdir): srcfile = urljoin(url, libfn) destfile = os.path.join(destdir, libfn) print('Retrieving "%s" to "%s"' % (srcfile, destfile)) + urlcleanup() # work around FTP bug 27973 in Py2.7.12+ urlretrieve(srcfile, destfile) d = unpack_zipfile(destfile, destdir) libs[libname] = d diff --git a/doc/html/FAQ.html b/doc/html/FAQ.html index 3c983036..1779f75c 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.

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

diff --git a/doc/html/api.html b/doc/html/api.html index 99daf6c7..6c0c3142 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 @@ -512,7 +512,7 @@ example:

diff --git a/doc/html/api/abc.ABCMeta-class.html b/doc/html/api/abc.ABCMeta-class.html index 49e2a5d0..90d08c83 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 Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 namespace to the Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 CSSSelector Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 namespaces keyword argument:

Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017
Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 want and got. Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017

Version: - 3.7.2 + 3.7.3

@@ -1705,7 +1705,7 @@ standard Python logging package.   - LXML_VERSION = (3, 7, 2, 0) + LXML_VERSION = (3, 7, 3, 0) @@ -1721,13 +1721,13 @@ standard Python logging package.   __pyx_capi__ = {'appendChild': <capsule object "void (struct L... @@ -2432,13 +2432,13 @@ function will only set the global error log of the current thread.

Value:
 {'appendChild': <capsule object "void (struct LxmlElement *, struct Lx\
-mlElement *)" at 0x7fc82e6af960>,
+mlElement *)" at 0x7fcea9d44960>,
  'appendChildToElement': <capsule object "int (struct LxmlElement *, s\
-truct LxmlElement *)" at 0x7fc82e6af990>,
+truct LxmlElement *)" at 0x7fcea9d44990>,
  'attributeValue': <capsule object "PyObject *(xmlNode *, xmlAttr *)" \
-at 0x7fc82e6af630>,
+at 0x7fcea9d44630>,
  'attributeValueFromNsName': <capsule object "PyObject *(xmlNode *, co\
-nst xmlChar *, const xmlChar *)" at 0x7fc82e6af660>,
+nst xmlChar *, const xmlChar *)" at 0x7fcea9d44660>,
 ...
 
@@ -2504,7 +2504,7 @@ nst xmlChar *, const xmlChar *)" at 0x7fc82e6af660> Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 smart_strings=False.

Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017
Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 base_url.

Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017
Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 file keyword argument Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 base_url.

Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017
Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 error_log property Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 iterparse().

Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017
Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 'GET' Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 <option> elemen Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 -
z0-9%&\?;=~ Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 lxml.etree.

Version: - 3.7.2 + 3.7.3

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

Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 skipif = <MarkDecorator 'skipif' {'args': (), 'kwargs': {}}> - +   - _fix_unicode = re.compile(r'(\s+)u(["\'])').sub + unichr_escape = re.compile(r'\\u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}') - +   - unichr_escape = re.compile(r'\\u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}') + _fix_unicode = re.compile(r'(\s+)u(["\'])').sub @@ -537,7 +537,7 @@ occurrences of pattern in string by the replacement repl. Generated by Epydoc 3.0.1 - on Sun Jan 8 15:23:26 2017 + on Sat Feb 18 22:13:05 2017 117 118 from io import StringIO 119 -120 if sys.version_info[0] >= 3: -121 # Python 3 -122 from builtins import str as unicode -123 _chr = chr -
124 - def _str(s, encoding="UTF-8"): -
125 return s -
126 - def _bytes(s, encoding="UTF-8"): -
127 return s.encode(120 unichr_escape = re.compile(r'\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}') +121 +122 if sys.version_info[0] >= 3: +123 # Python 3 +124 from builtins import str as unicode +125 from codecs import unicode_escape_decode +126 _chr = chr +
127 - def _str(s, encoding="UTF-8"): +
128 return unichr_escape.sub(lambda x: unicode_escape_decode(x.group(0))[0], s) +
129 - def _bytes(s, encoding="UTF-8"): +
130 return s.encode(encoding) -
128 from io import BytesIO as _BytesIO -
129 - def BytesIO(*args): -
130 if args and isinstance(args[0], str): -131 args = (args[0].encode("UTF-8"),) -132 return _BytesIO(*args) -
133 -134 doctest_parser = doctest.DocTestParser() -135 _fix_unicode = re.compile(r'(\s+)u(["\'])').sub -136 _fix_exceptions = re.compile(r'(.*except [^(]*),\s*(.*:)').sub -
137 - def make_doctest(filename): -
138 filename = _get_caller_relative_path(filename) -139 doctests = read_file(filename) -140 doctests = _fix_unicode(r'\1\2', doctests) -141 doctests = _fix_exceptions(r'\1 as \2', doctests) -142 return doctest.DocTestCase( -143 doctest_parser.get_doctest( -144 doctests, {}, os.path.basename(filename), filename, 0)) -
145 else: -146 # Python 2 -147 unichr_escape = re.compile(r'\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}') -148 -149 from __builtin__ import unicode -150 _chr = unichr -
151 - def _str(s, encoding="UTF-8"): -
152 s = unicode(s, encoding) +
131 from io import BytesIO as _BytesIO +
132 - def BytesIO(*args): +
133 if args and isinstance(args[0], str): +134 args = (args[0].encode("UTF-8"),) +135 return _BytesIO(*args) +
136 +137 doctest_parser = doctest.DocTestParser() +138 _fix_unicode = re.compile(r'(\s+)u(["\'])').sub +139 _fix_exceptions = re.compile(r'(.*except [^(]*),\s*(.*:)').sub +
140 - def make_doctest(filename): +
141 filename = _get_caller_relative_path(filename) +142 doctests = read_file(filename) +143 doctests = _fix_unicode(r'\1\2', doctests) +144 doctests = _fix_exceptions(r'\1 as \2', doctests) +145 return doctest.DocTestCase( +146 doctest_parser.get_doctest( +147 doctests, {}, os.path.basename(filename), filename, 0)) +
148 else: +149 # Python 2 +150 from __builtin__ import unicode +151 _chr = unichr +
152 - def _str(s, encoding="UTF-8"): +
153 s = unicode(s, encoding=encoding=encoding) -153 return unichr_escape.sub(lambda x: -154 x.group(0).decode('unicode-escape'), -155 s) -
156 - def _bytes(s, encoding="UTF-8"): -
157 return s -
158 from io import BytesIO -159 -160 doctest_parser = doctest.DocTestParser() -161 _fix_traceback = re.compile(r'^(\s*)(?:\w+\.)+(\w*(?:Error|Exception|Invalid):)', re.M).sub -162 _fix_exceptions = re.compile(r'(.*except [^(]*)\s+as\s+(.*:)').sub -163 _fix_bytes = re.compile(r'(\s+)b(["\'])').sub -
164 - def make_doctest(filename): -
165 filename = _get_caller_relative_path(filename) -166 doctests = read_file(filename) -167 doctests = _fix_traceback(r'\1\2', doctests) -168 doctests = _fix_exceptions(r'\1, \2', doctests) -169 doctests = _fix_bytes(r'\1\2', doctests) -170 return doctest.DocTestCase( -171 doctest_parser.get_doctest( -172 doctests, {}, os.path.basename(filename), filename, 0)) -
173 -174 try: -175 skipIf = unittest.skipIf -176 except AttributeError: -
177 - def skipIf(condition, why, -178 _skip=lambda test_method: None, -179 _keep=lambda test_method: test_method): -
180 if condition: -181 return _skip -182 return _keep -
183 -184 -
185 -class HelperTestCase(unittest.TestCase): -
186 - def tearDown(self): -
187 gc.collect() +lxml.tests.selftest2.encoding" class="py-name" href="#" onclick="return doclink('link-70', 'encoding', 'link-52');">encoding) +154 return unichr_escape.sub(lambda x: +155 x.group(0).decode('unicode-escape'), +156 s) +
157 - def _bytes(s, encoding="UTF-8"): +
158 return s +
159 from io import BytesIO +160 +161 doctest_parser = doctest.DocTestParser() +162 _fix_traceback = re.compile(r'^(\s*)(?:\w+\.)+(\w*(?:Error|Exception|Invalid):)', re.M).sub +163 _fix_exceptions = re.compile(r'(.*except [^(]*)\s+as\s+(.*:)').sub +164 _fix_bytes = re.compile(r'(\s+)b(["\'])').sub +
165 - def make_doctest(filename): +
166 filename = _get_caller_relative_path(filename) +167 doctests = read_file(filename) +168 doctests = _fix_traceback(r'\1\2', doctests) +169 doctests = _fix_exceptions(r'\1, \2', doctests) +170 doctests = _fix_bytes(r'\1\2', doctests) +171 return doctest.DocTestCase( +172 doctest_parser.get_doctest( +173 doctests, {}, os.path.basename(filename), filename, 0)) +
174 +175 try: +176 skipIf = unittest.skipIf +177 except AttributeError: +
178 - def skipIf(condition, why): +
179 def _skip(thing): +180 import types +181 if isinstance(thing, (type, types.ClassType)): +182 return type(thing.__name__, (object,), {}) +183 else: +184 return None +
185 if condition: +186 return _skip +187 return lambda thing: thing
188 -
189 - def parse(self, text, parser=None): -
190 f = BytesIO(189 +
190 -class HelperTestCase(unittest.TestCase): +
191 - def tearDown(self): +
192 gc.collect() +
193 +
194 - def parse(self, text, parser=None): +
195 f = BytesIO(text) if isinstance(text) if isinstance(text, bytes) else StringIO(text, bytes) else StringIO(text) -191 return text) +196 return etree.etree.parse(f, parser=parser) -
192 -
193 - def _rootstring(self, tree): -
194 return parse(f, parser=parser) +
197 +
198 - def _rootstring(self, tree): +
199 return etree.tostring(tree.getroot()).replace( -195 _bytes(' '), _bytes('')).replace(_bytes('\n'), _bytes('')) -
196 -197 # assertFalse doesn't exist in Python 2.3 -198 try: -199 unittest.TestCase.assertFalse -200 except AttributeError: -201 assertFalse = unittest.TestCase.failIf -
202 -203 -
204 -class SillyFileLike: -
205 - def __init__(self, xml_data=_bytes('<foo><bar/></foo>')): -
206 self.xml_data = xml_data -
207 -
208 - def read(self, amount=None): -
209 if self.xml_data: -210 if amount: -211 data = self.xml_data[:amount] -212 self.xml_data = self.xml_data[amount:] -213 else: -214 data = self.xml_data -215 self.xml_data = _bytes('') -216 return data -217 return _bytes('') -
218 -
219 -class LargeFileLike: -
220 - def __init__(self, charlen=100, depth=4, children=5): -
221 self.data = BytesIO() -222 self.chars = _bytes('a') * charlen -223 self.children = range(children) -224 self.more = self.etree.tostring(tree.getroot()).replace( +200 _bytes(' '), _bytes('')).replace(_bytes('\n'), _bytes('')) +
201 +202 # assertFalse doesn't exist in Python 2.3 +203 try: +204 unittest.TestCase.assertFalse +205 except AttributeError: +206 assertFalse = unittest.TestCase.failIf +
207 +208 +
209 -class SillyFileLike: +
210 - def __init__(self, xml_data=_bytes('<foo><bar/></foo>')): +
211 self.xml_data = xml_data +
212 +
213 - def read(self, amount=None): +
214 if self.xml_data: +215 if amount: +216 data = self.xml_data[:amount] +217 self.xml_data = self.xml_data[amount:] +218 else: +219 data = self.xml_data +220 self.xml_data = _bytes('') +221 return data +222 return _bytes('') +
223 +
224 -class LargeFileLike: +
225 - def __init__(self, charlen=100, depth=4, children=5): +
226 self.data = BytesIO() +227 self.chars = _bytes('a') * charlen +228 self.children = range(children) +229 self.more = self.iterelements(depth) -
225 -
226 - def iterelements(self, depth): -
227 yield _bytes('<root>') -228 depth -= 1 -229 if depth > 0: -230 for child in self.children: -231 for element in self.iterelements(depth) +
230 +
231 - def iterelements(self, depth): +
232 yield _bytes('<root>') +233 depth -= 1 +234 if depth > 0: +235 for child in self.children: +236 for element in self.iterelements(depth): -232 yield element -233 yield self.chars -234 else: -235 yield self.chars -236 yield _bytes('</root>') -
237 -
238 - def read(self, amount=None): -
239 data = self.data -240 append = data.write -241 if amount: -242 for element in self.more: -243 append(element) -244 if data.tell() >= amount: -245 break -246 else: -247 for element in self.more: -248 append(element) -249 result = data.getvalue() -250 data.seek(0) -251 data.truncate() -252 if amount: -253 append(result[amount:]) -254 result = result[:amount] -255 return result -
256 -
257 -class LargeFileLikeUnicode(LargeFileLike): -
258 - def __init__(self, charlen=100, depth=4, children=5): -
259 LargeFileLike.iterelements(depth): +237 yield element +238 yield self.chars +239 else: +240 yield self.chars +241 yield _bytes('</root>') +
242 +
243 - def read(self, amount=None): +
244 data = self.data +245 append = data.write +246 if amount: +247 for element in self.more: +248 append(element) +249 if data.tell() >= amount: +250 break +251 else: +252 for element in self.more: +253 append(element) +254 result = data.getvalue() +255 data.seek(0) +256 data.truncate() +257 if amount: +258 append(result[amount:]) +259 result = result[:amount] +260 return result +
261 +
262 -class LargeFileLikeUnicode(LargeFileLike): +
263 - def __init__(self, charlen=100, depth=4, children=5): +
264 LargeFileLike.__init__(self, charlen, depth, children) -260 self.data = StringIO() -261 self.chars = _str('a') * charlen -262 self.more = self.__init__(self, charlen, depth, children) +265 self.data = StringIO() +266 self.chars = _str('a') * charlen +267 self.more = self.iterelements(depth) -
263 -
264 - def iterelements(self, depth): -
265 yield _str('<root>') -266 depth -= 1 -267 if depth > 0: -268 for child in self.children: -269 for element in self.iterelements(depth) +
268 +
269 - def iterelements(self, depth): +
270 yield _str('<root>') +271 depth -= 1 +272 if depth > 0: +273 for child in self.children: +274 for element in self.iterelements(depth): -270 yield element -271 yield self.chars -272 else: -273 yield self.chars -274 yield _str('</root>') -
275 -
276 -def fileInTestDir(name): -
277 _testdir = os.path.dirname(__file__) -278 return os.path.join(_testdir, iterelements(depth): +275 yield element +276 yield self.chars +277 else: +278 yield self.chars +279 yield _str('</root>') +
280 +
281 -def fileInTestDir(name): +
282 _testdir = os.path.dirname(__file__) +283 return os.path.join(_testdir, name) -
279 -
280 -def path2url(path): -
281 return urlparse.urljoin( -282 'file:', pathname2url(path)) -
283 -
284 -def fileUrlInTestDir(name): -
284 +
285 -def path2url(path): +
286 return urlparse.urljoin( +287 'file:', pathname2url(path)) +
288 +
289 -def fileUrlInTestDir(name): +
290 return path2url(fileInTestDir(name)) -
286 -
287 -def read_file(name, mode='r'): -
288 f = open(name)) +
291 +
292 -def read_file(name, mode='r'): +
293 f = open(name, mode) -289 try: -290 data = f.read() -291 finally: -292 f.name, mode) +294 try: +295 data = f.read() +296 finally: +297 f.close() -293 return data -
294 -
295 -def write_to_file(name, data, mode='w'): -
296 f = open(close() +298 return data +
299 +
300 -def write_to_file(name, data, mode='w'): +
301 f = open(name, mode) -297 try: -298 data = f.write(data) -299 finally: -300 f.name, mode) +302 try: +303 data = f.write(data) +304 finally: +305 f.close() -
301 -
302 -def readFileInTestDir(name, mode='r'): -
306 +
307 -def readFileInTestDir(name, mode='r'): +
308 return read_file(fileInTestDir(name), mode) -
304 -
305 -def canonicalize(xml): -
306 tree = name), mode) +
309 +
310 -def canonicalize(xml): +
311 tree = etree.etree.parse(BytesIO(xml) if isinstance(xml, bytes) else StringIO(xml)) -307 f = BytesIO() -308 tree.write_c14n(f) -309 return f.getvalue() -
310 -
311 -def unentitify(xml): -
312 for entity_name, parse(BytesIO(xml) if isinstance(xml, bytes) else StringIO(xml)) +312 f = BytesIO() +313 tree.write_c14n(f) +314 return f.getvalue() +
315 +
316 -def unentitify(xml): +
317 for entity_name, value in re.findall("(&#([0-9]+);)", xml): -313 xml = xml.replace(entity_name, unichr(int(value in re.findall("(&#([0-9]+);)", xml): +318 xml = xml.replace(entity_name, unichr(int(value))) -314 return xml -
315
-

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 @@ -303,7 +303,7 @@ installed using dpkg -i

diff --git a/doc/html/capi.html b/doc/html/capi.html index 733cd09f..e3369fc5 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, @@ -110,7 +110,7 @@ includes may not be sufficient.

diff --git a/doc/html/changes-3.7.2.html b/doc/html/changes-3.7.2.html deleted file mode 100644 index 7b0a6aa3..00000000 --- a/doc/html/changes-3.7.2.html +++ /dev/null @@ -1,3165 +0,0 @@ - - - - - - -lxml changelog - - - -
-

lxml changelog

- -
-

3.7.2 (2017-01-08)

-
-

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 is 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 pickeling 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-3.7.3.html b/doc/html/changes-3.7.3.html new file mode 100644 index 00000000..d05174b0 --- /dev/null +++ b/doc/html/changes-3.7.3.html @@ -0,0 +1,3180 @@ + + + + + + +lxml changelog + + + +
+

lxml changelog

+ +
+

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 6514cc1e..b90dd1bf 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 5246e6ff..5d8b92c9 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 7c656aec..7d6aa452 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 @@ -108,7 +108,7 @@ namespace URIs: the CSSSelector class accepts

diff --git a/doc/html/element_classes.html b/doc/html/element_classes.html index f372bfce..0adca657 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 @@ -459,7 +459,7 @@ subclasses for elements of this namespace:

diff --git a/doc/html/elementsoup.html b/doc/html/elementsoup.html index 10b9906e..dd2e4c3b 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 fd1255a0..a343df3e 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:

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

diff --git a/doc/html/html5parser.html b/doc/html/html5parser.html index 80a6eb6d..b681b42f 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 b7305de3..fd95ec6b 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

@@ -67,7 +67,7 @@ fast Python XML processing.

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 fdb45379..73763033 100644 --- a/doc/html/installation.html +++ b/doc/html/installation.html @@ -24,7 +24,7 @@ function hide_menu() {
-

Installing lxml

+

Installing lxml

Contents

@@ -215,7 +215,7 @@ read the
diff --git a/doc/html/intro.html b/doc/html/intro.html index da661791..a9bcd942 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 b1727002..eab30246 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 f303d40f..9b990b63 100644 --- a/doc/html/lxmlhtml.html +++ b/doc/html/lxmlhtml.html @@ -25,7 +25,7 @@ function hide_menu() {
-

lxml.html

+

lxml.html

@@ -190,7 +190,7 @@ readable diff in the output when a test fails. The HTML comparison is most easily used by importing the usedoctest module in a doctest:

>>> import lxml.html.usedoctest
 
-

Now, if you have a HTML document and want to compare it to an expected result +

Now, if you have an HTML document and want to compare it to an expected result document in a doctest, you can do the following:

>>> import lxml.html
 >>> html = lxml.html.fromstring('''\
@@ -696,7 +696,7 @@ microformat.

diff --git a/doc/html/objectify.html b/doc/html/objectify.html index b39de75f..d6de43b6 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 fe44ccfe..8bd30ffa 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 @@ -867,7 +867,7 @@ with UTF-8 is also considerably faster in most cases.

diff --git a/doc/html/performance.html b/doc/html/performance.html index d893141b..54dcfe40 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 0212132c..779610c8 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 2f9fc781..70aa62e2 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 430965cf..07328db1 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 b58951dd..e303aebe 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 620f5537..2a59ddc5 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 bd3fdf5e..86681ec5 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.

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

diff --git a/doc/lxmlhtml.txt b/doc/lxmlhtml.txt index 93bb0c27..cc59d97a 100644 --- a/doc/lxmlhtml.txt +++ b/doc/lxmlhtml.txt @@ -178,7 +178,7 @@ most easily used by importing the ``usedoctest`` module in a doctest: >>> import lxml.html.usedoctest -Now, if you have a HTML document and want to compare it to an expected result +Now, if you have an HTML document and want to compare it to an expected result document in a doctest, you can do the following: .. sourcecode:: pycon diff --git a/doc/main.txt b/doc/main.txt index c9ca624b..fe42c6be 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 3.7.2`_, released 2017-01-08 -(`changes for 3.7.2`_). `Older versions <#old-versions>`_ +The latest version is `lxml 3.7.3`_, released 2017-02-18 +(`changes for 3.7.3`_). `Older versions <#old-versions>`_ are listed below. Please take a look at the @@ -246,7 +246,9 @@ See the websites of lxml .. and the `latest in-development version `_. -.. _`PDF documentation`: lxmldoc-3.7.2.pdf +.. _`PDF documentation`: lxmldoc-3.7.3.pdf + +* `lxml 3.7.3`_, released 2017-02-18 (`changes for 3.7.3`_) * `lxml 3.7.2`_, released 2017-01-08 (`changes for 3.7.2`_) @@ -266,6 +268,7 @@ See the websites of lxml * `older releases `_ +.. _`lxml 3.7.3`: /files/lxml-3.7.3.tgz .. _`lxml 3.7.2`: /files/lxml-3.7.2.tgz .. _`lxml 3.7.1`: /files/lxml-3.7.1.tgz .. _`lxml 3.7.0`: /files/lxml-3.7.0.tgz @@ -275,6 +278,7 @@ See the websites of lxml .. _`lxml 3.6.1`: /files/lxml-3.6.1.tgz .. _`lxml 3.6.0`: /files/lxml-3.6.0.tgz +.. _`changes for 3.7.3`: /changes-3.7.3.html .. _`changes for 3.7.2`: /changes-3.7.2.html .. _`changes for 3.7.1`: /changes-3.7.1.html .. _`changes for 3.7.0`: /changes-3.7.0.html diff --git a/src/lxml.egg-info/PKG-INFO b/src/lxml.egg-info/PKG-INFO index d876caa7..22b03bea 100644 --- a/src/lxml.egg-info/PKG-INFO +++ b/src/lxml.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: lxml -Version: 3.7.2 +Version: 3.7.3 Summary: Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. Home-page: http://lxml.de/ Author: lxml dev team @@ -36,20 +36,16 @@ 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. - 3.7.2 (2017-01-08) + 3.7.3 (2017-02-18) ================== Bugs fixed ---------- - * Work around installation problems in recent Python 2.7 versions - due to FTP download failures. + * GH#218 was ineffective in Python 3. - * 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. + * GH#222: ``lxml.html.submit_form()`` failed in Python 3. + Patch by Jakub Wilk. diff --git a/src/lxml.egg-info/SOURCES.txt b/src/lxml.egg-info/SOURCES.txt index 252a1fce..fdcc3c31 100644 --- a/src/lxml.egg-info/SOURCES.txt +++ b/src/lxml.egg-info/SOURCES.txt @@ -58,7 +58,7 @@ doc/html/FAQ.html doc/html/api.html doc/html/build.html doc/html/capi.html -doc/html/changes-3.7.2.html +doc/html/changes-3.7.3.html doc/html/compatibility.html doc/html/credits.html doc/html/cssselect.html diff --git a/src/lxml/includes/lxml-version.h b/src/lxml/includes/lxml-version.h index 7e4c152c..ae99a477 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 "3.7.2" +#define LXML_VERSION_STRING "3.7.3" #endif diff --git a/src/lxml/lxml.etree.c b/src/lxml/lxml.etree.c index 0ea8f16c..d4820919 100644 --- a/src/lxml/lxml.etree.c +++ b/src/lxml/lxml.etree.c @@ -2257,7 +2257,7 @@ struct __pyx_obj_4lxml_5etree__IncrementalFileWriter { }; -/* "src/lxml/serializer.pxi":1219 +/* "src/lxml/serializer.pxi":1220 * @cython.internal * @cython.freelist(8) * cdef class _FileWriterElement: # <<<<<<<<<<<<<< @@ -8071,7 +8071,6 @@ static PyObject *__pyx_kp_b_http_www_w3_org_1999_02_22_rdf_s; static PyObject *__pyx_kp_b_http_www_w3_org_1999_XSL_Transfo; static PyObject *__pyx_kp_u_http_www_w3_org_1999_XSL_Transfo; static PyObject *__pyx_kp_b_http_www_w3_org_1999_xhtml; -static PyObject *__pyx_kp_s_http_www_w3_org_1999_xhtml; static PyObject *__pyx_kp_b_http_www_w3_org_2001_XMLSchema; static PyObject *__pyx_kp_u_http_www_w3_org_2001_XMLSchema; static PyObject *__pyx_kp_b_http_www_w3_org_2001_XMLSchema_i; @@ -8353,7 +8352,7 @@ static PyObject *__pyx_kp_s_s_s_object_name_r_prefix_r_type; static PyObject *__pyx_kp_s_s_s_object_name_r_type_r_occur; static PyObject *__pyx_kp_u_s_w_s_s; static PyObject *__pyx_n_s_schema; -static PyObject *__pyx_n_s_script; +static PyObject *__pyx_n_b_script; static PyObject *__pyx_n_s_search; static PyObject *__pyx_n_s_self; static PyObject *__pyx_n_s_self_node; @@ -8398,6 +8397,7 @@ static PyObject *__pyx_n_s_strip_elements; static PyObject *__pyx_n_s_strip_tags; static PyObject *__pyx_n_s_strparam; static PyObject *__pyx_n_s_strval; +static PyObject *__pyx_n_b_style; static PyObject *__pyx_n_s_style; static PyObject *__pyx_n_s_sub; static PyObject *__pyx_n_s_super; @@ -144902,7 +144902,6 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ PyObject *(*__pyx_t_13)(PyObject *); int __pyx_t_14; Py_ssize_t __pyx_t_15; - const char *__pyx_t_16; __Pyx_RefNannySetupContext("write", 0); /* "src/lxml/serializer.pxi":1151 @@ -145065,8 +145064,8 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ * content = _utf8(content) * * ns, name, _, _ = self._element_stack[-1] # <<<<<<<<<<<<<< - * if c_method == OUTPUT_METHOD_HTML and \ - * ns in (None, 'http://www.w3.org/1999/xhtml') and name in ('script', 'style'): + * if (c_method == OUTPUT_METHOD_HTML and + * ns in (None, b'http://www.w3.org/1999/xhtml') and */ if (unlikely(__pyx_v_self->_element_stack == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); @@ -145149,9 +145148,9 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ /* "src/lxml/serializer.pxi":1162 * * ns, name, _, _ = self._element_stack[-1] - * if c_method == OUTPUT_METHOD_HTML and \ # <<<<<<<<<<<<<< - * ns in (None, 'http://www.w3.org/1999/xhtml') and name in ('script', 'style'): - * tree.xmlOutputBufferWrite(self._c_out, len(content), content) + * if (c_method == OUTPUT_METHOD_HTML and # <<<<<<<<<<<<<< + * ns in (None, b'http://www.w3.org/1999/xhtml') and + * name in (b'script', b'style')): */ __pyx_t_7 = ((__pyx_v_c_method == __pyx_e_4lxml_5etree_OUTPUT_METHOD_HTML) != 0); if (__pyx_t_7) { @@ -145162,10 +145161,10 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ /* "src/lxml/serializer.pxi":1163 * ns, name, _, _ = self._element_stack[-1] - * if c_method == OUTPUT_METHOD_HTML and \ - * ns in (None, 'http://www.w3.org/1999/xhtml') and name in ('script', 'style'): # <<<<<<<<<<<<<< - * tree.xmlOutputBufferWrite(self._c_out, len(content), content) - * else: + * if (c_method == OUTPUT_METHOD_HTML and + * ns in (None, b'http://www.w3.org/1999/xhtml') and # <<<<<<<<<<<<<< + * name in (b'script', b'style')): + * tree.xmlOutputBufferWrite(self._c_out, len(content), _cstr(content)) */ __Pyx_INCREF(__pyx_v_ns); __pyx_t_8 = __pyx_v_ns; @@ -145177,7 +145176,7 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ __pyx_t_7 = __pyx_t_14; goto __pyx_L16_bool_binop_done; } - __pyx_t_14 = (__Pyx_PyString_Equals(__pyx_t_8, __pyx_kp_s_http_www_w3_org_1999_xhtml, Py_EQ)); if (unlikely(__pyx_t_14 < 0)) __PYX_ERR(7, 1163, __pyx_L1_error) + __pyx_t_14 = (__Pyx_PyBytes_Equals(__pyx_t_8, __pyx_kp_b_http_www_w3_org_1999_xhtml, Py_EQ)); if (unlikely(__pyx_t_14 < 0)) __PYX_ERR(7, 1163, __pyx_L1_error) __pyx_t_7 = __pyx_t_14; __pyx_L16_bool_binop_done:; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; @@ -145187,15 +145186,23 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ __pyx_t_2 = __pyx_t_14; goto __pyx_L13_bool_binop_done; } + + /* "src/lxml/serializer.pxi":1164 + * if (c_method == OUTPUT_METHOD_HTML and + * ns in (None, b'http://www.w3.org/1999/xhtml') and + * name in (b'script', b'style')): # <<<<<<<<<<<<<< + * tree.xmlOutputBufferWrite(self._c_out, len(content), _cstr(content)) + * else: + */ __Pyx_INCREF(__pyx_v_name); __pyx_t_8 = __pyx_v_name; - __pyx_t_7 = (__Pyx_PyString_Equals(__pyx_t_8, __pyx_n_s_script, Py_EQ)); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(7, 1163, __pyx_L1_error) + __pyx_t_7 = (__Pyx_PyBytes_Equals(__pyx_t_8, __pyx_n_b_script, Py_EQ)); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(7, 1164, __pyx_L1_error) if (!__pyx_t_7) { } else { __pyx_t_14 = __pyx_t_7; goto __pyx_L18_bool_binop_done; } - __pyx_t_7 = (__Pyx_PyString_Equals(__pyx_t_8, __pyx_n_s_style, Py_EQ)); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(7, 1163, __pyx_L1_error) + __pyx_t_7 = (__Pyx_PyBytes_Equals(__pyx_t_8, __pyx_n_b_style, Py_EQ)); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(7, 1164, __pyx_L1_error) __pyx_t_14 = __pyx_t_7; __pyx_L18_bool_binop_done:; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; @@ -145206,35 +145213,34 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ /* "src/lxml/serializer.pxi":1162 * * ns, name, _, _ = self._element_stack[-1] - * if c_method == OUTPUT_METHOD_HTML and \ # <<<<<<<<<<<<<< - * ns in (None, 'http://www.w3.org/1999/xhtml') and name in ('script', 'style'): - * tree.xmlOutputBufferWrite(self._c_out, len(content), content) + * if (c_method == OUTPUT_METHOD_HTML and # <<<<<<<<<<<<<< + * ns in (None, b'http://www.w3.org/1999/xhtml') and + * name in (b'script', b'style')): */ if (__pyx_t_2) { - /* "src/lxml/serializer.pxi":1164 - * if c_method == OUTPUT_METHOD_HTML and \ - * ns in (None, 'http://www.w3.org/1999/xhtml') and name in ('script', 'style'): - * tree.xmlOutputBufferWrite(self._c_out, len(content), content) # <<<<<<<<<<<<<< + /* "src/lxml/serializer.pxi":1165 + * ns in (None, b'http://www.w3.org/1999/xhtml') and + * name in (b'script', b'style')): + * tree.xmlOutputBufferWrite(self._c_out, len(content), _cstr(content)) # <<<<<<<<<<<<<< * else: * tree.xmlOutputBufferWriteEscape(self._c_out, _xcstr(content), NULL) */ - __pyx_t_15 = PyObject_Length(__pyx_v_content); if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(7, 1164, __pyx_L1_error) - __pyx_t_16 = __Pyx_PyObject_AsString(__pyx_v_content); if (unlikely((!__pyx_t_16) && PyErr_Occurred())) __PYX_ERR(7, 1164, __pyx_L1_error) - xmlOutputBufferWrite(__pyx_v_self->_c_out, __pyx_t_15, __pyx_t_16); + __pyx_t_15 = PyObject_Length(__pyx_v_content); if (unlikely(__pyx_t_15 == -1)) __PYX_ERR(7, 1165, __pyx_L1_error) + xmlOutputBufferWrite(__pyx_v_self->_c_out, __pyx_t_15, PyBytes_AS_STRING(__pyx_v_content)); /* "src/lxml/serializer.pxi":1162 * * ns, name, _, _ = self._element_stack[-1] - * if c_method == OUTPUT_METHOD_HTML and \ # <<<<<<<<<<<<<< - * ns in (None, 'http://www.w3.org/1999/xhtml') and name in ('script', 'style'): - * tree.xmlOutputBufferWrite(self._c_out, len(content), content) + * if (c_method == OUTPUT_METHOD_HTML and # <<<<<<<<<<<<<< + * ns in (None, b'http://www.w3.org/1999/xhtml') and + * name in (b'script', b'style')): */ goto __pyx_L12; } - /* "src/lxml/serializer.pxi":1166 - * tree.xmlOutputBufferWrite(self._c_out, len(content), content) + /* "src/lxml/serializer.pxi":1167 + * tree.xmlOutputBufferWrite(self._c_out, len(content), _cstr(content)) * else: * tree.xmlOutputBufferWriteEscape(self._c_out, _xcstr(content), NULL) # <<<<<<<<<<<<<< * @@ -145255,14 +145261,14 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ goto __pyx_L5; } - /* "src/lxml/serializer.pxi":1168 + /* "src/lxml/serializer.pxi":1169 * tree.xmlOutputBufferWriteEscape(self._c_out, _xcstr(content), NULL) * * elif iselement(content): # <<<<<<<<<<<<<< * if self._status > WRITER_IN_ELEMENT: * raise LxmlSyntaxError("cannot append trailing element to complete XML document") */ - __pyx_t_11 = __Pyx_GetModuleGlobalName(__pyx_n_s_iselement); if (unlikely(!__pyx_t_11)) __PYX_ERR(7, 1168, __pyx_L1_error) + __pyx_t_11 = __Pyx_GetModuleGlobalName(__pyx_n_s_iselement); if (unlikely(!__pyx_t_11)) __PYX_ERR(7, 1169, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __pyx_t_10 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_11))) { @@ -145275,13 +145281,13 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ } } if (!__pyx_t_10) { - __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_11, __pyx_v_content); if (unlikely(!__pyx_t_8)) __PYX_ERR(7, 1168, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_11, __pyx_v_content); if (unlikely(!__pyx_t_8)) __PYX_ERR(7, 1169, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); } else { #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_11)) { PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_v_content}; - __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_11, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(7, 1168, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_11, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(7, 1169, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_GOTREF(__pyx_t_8); } else @@ -145289,29 +145295,29 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_11)) { PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_v_content}; - __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_11, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(7, 1168, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_11, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(7, 1169, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_GOTREF(__pyx_t_8); } else #endif { - __pyx_t_9 = PyTuple_New(1+1); if (unlikely(!__pyx_t_9)) __PYX_ERR(7, 1168, __pyx_L1_error) + __pyx_t_9 = PyTuple_New(1+1); if (unlikely(!__pyx_t_9)) __PYX_ERR(7, 1169, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_10); __pyx_t_10 = NULL; __Pyx_INCREF(__pyx_v_content); __Pyx_GIVEREF(__pyx_v_content); PyTuple_SET_ITEM(__pyx_t_9, 0+1, __pyx_v_content); - __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_11, __pyx_t_9, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(7, 1168, __pyx_L1_error) + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_11, __pyx_t_9, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(7, 1169, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; } } __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(7, 1168, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(7, 1169, __pyx_L1_error) __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; if (__pyx_t_2) { - /* "src/lxml/serializer.pxi":1169 + /* "src/lxml/serializer.pxi":1170 * * elif iselement(content): * if self._status > WRITER_IN_ELEMENT: # <<<<<<<<<<<<<< @@ -145321,23 +145327,23 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ __pyx_t_2 = ((__pyx_v_self->_status > __pyx_e_4lxml_5etree_WRITER_IN_ELEMENT) != 0); if (__pyx_t_2) { - /* "src/lxml/serializer.pxi":1170 + /* "src/lxml/serializer.pxi":1171 * elif iselement(content): * if self._status > WRITER_IN_ELEMENT: * raise LxmlSyntaxError("cannot append trailing element to complete XML document") # <<<<<<<<<<<<<< * _writeNodeToBuffer(self._c_out, (<_Element>content)._c_node, * self._c_encoding, NULL, c_method, */ - __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_LxmlSyntaxError); if (unlikely(!__pyx_t_8)) __PYX_ERR(7, 1170, __pyx_L1_error) + __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_LxmlSyntaxError); if (unlikely(!__pyx_t_8)) __PYX_ERR(7, 1171, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); - __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_tuple__77, NULL); if (unlikely(!__pyx_t_11)) __PYX_ERR(7, 1170, __pyx_L1_error) + __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_tuple__77, NULL); if (unlikely(!__pyx_t_11)) __PYX_ERR(7, 1171, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_Raise(__pyx_t_11, 0, 0, 0); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - __PYX_ERR(7, 1170, __pyx_L1_error) + __PYX_ERR(7, 1171, __pyx_L1_error) - /* "src/lxml/serializer.pxi":1169 + /* "src/lxml/serializer.pxi":1170 * * elif iselement(content): * if self._status > WRITER_IN_ELEMENT: # <<<<<<<<<<<<<< @@ -145346,7 +145352,7 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ */ } - /* "src/lxml/serializer.pxi":1171 + /* "src/lxml/serializer.pxi":1172 * if self._status > WRITER_IN_ELEMENT: * raise LxmlSyntaxError("cannot append trailing element to complete XML document") * _writeNodeToBuffer(self._c_out, (<_Element>content)._c_node, # <<<<<<<<<<<<<< @@ -145355,7 +145361,7 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ */ __pyx_f_4lxml_5etree__writeNodeToBuffer(__pyx_v_self->_c_out, ((struct LxmlElement *)__pyx_v_content)->_c_node, __pyx_v_self->_c_encoding, NULL, __pyx_v_c_method, 0, 0, __pyx_v_pretty_print, __pyx_v_with_tail, 0); - /* "src/lxml/serializer.pxi":1174 + /* "src/lxml/serializer.pxi":1175 * self._c_encoding, NULL, c_method, * False, False, pretty_print, with_tail, False) * if (<_Element>content)._c_node.type == tree.XML_ELEMENT_NODE: # <<<<<<<<<<<<<< @@ -145365,7 +145371,7 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ __pyx_t_2 = ((((struct LxmlElement *)__pyx_v_content)->_c_node->type == XML_ELEMENT_NODE) != 0); if (__pyx_t_2) { - /* "src/lxml/serializer.pxi":1175 + /* "src/lxml/serializer.pxi":1176 * False, False, pretty_print, with_tail, False) * if (<_Element>content)._c_node.type == tree.XML_ELEMENT_NODE: * if not self._element_stack: # <<<<<<<<<<<<<< @@ -145376,7 +145382,7 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ __pyx_t_7 = ((!__pyx_t_2) != 0); if (__pyx_t_7) { - /* "src/lxml/serializer.pxi":1176 + /* "src/lxml/serializer.pxi":1177 * if (<_Element>content)._c_node.type == tree.XML_ELEMENT_NODE: * if not self._element_stack: * self._status = WRITER_FINISHED # <<<<<<<<<<<<<< @@ -145385,7 +145391,7 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ */ __pyx_v_self->_status = __pyx_e_4lxml_5etree_WRITER_FINISHED; - /* "src/lxml/serializer.pxi":1175 + /* "src/lxml/serializer.pxi":1176 * False, False, pretty_print, with_tail, False) * if (<_Element>content)._c_node.type == tree.XML_ELEMENT_NODE: * if not self._element_stack: # <<<<<<<<<<<<<< @@ -145394,7 +145400,7 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ */ } - /* "src/lxml/serializer.pxi":1174 + /* "src/lxml/serializer.pxi":1175 * self._c_encoding, NULL, c_method, * False, False, pretty_print, with_tail, False) * if (<_Element>content)._c_node.type == tree.XML_ELEMENT_NODE: # <<<<<<<<<<<<<< @@ -145403,7 +145409,7 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ */ } - /* "src/lxml/serializer.pxi":1168 + /* "src/lxml/serializer.pxi":1169 * tree.xmlOutputBufferWriteEscape(self._c_out, _xcstr(content), NULL) * * elif iselement(content): # <<<<<<<<<<<<<< @@ -145413,7 +145419,7 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ goto __pyx_L5; } - /* "src/lxml/serializer.pxi":1178 + /* "src/lxml/serializer.pxi":1179 * self._status = WRITER_FINISHED * else: * raise TypeError("got invalid input value of type %s, expected string or Element" % type(content)) # <<<<<<<<<<<<<< @@ -145421,30 +145427,30 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ * if not self._buffered: */ /*else*/ { - __pyx_t_11 = __Pyx_PyString_Format(__pyx_kp_s_got_invalid_input_value_of_type, ((PyObject *)Py_TYPE(__pyx_v_content))); if (unlikely(!__pyx_t_11)) __PYX_ERR(7, 1178, __pyx_L1_error) + __pyx_t_11 = __Pyx_PyString_Format(__pyx_kp_s_got_invalid_input_value_of_type, ((PyObject *)Py_TYPE(__pyx_v_content))); if (unlikely(!__pyx_t_11)) __PYX_ERR(7, 1179, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); - __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(7, 1178, __pyx_L1_error) + __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(7, 1179, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_11); __pyx_t_11 = 0; - __pyx_t_11 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_t_8, NULL); if (unlikely(!__pyx_t_11)) __PYX_ERR(7, 1178, __pyx_L1_error) + __pyx_t_11 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_t_8, NULL); if (unlikely(!__pyx_t_11)) __PYX_ERR(7, 1179, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_Raise(__pyx_t_11, 0, 0, 0); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - __PYX_ERR(7, 1178, __pyx_L1_error) + __PYX_ERR(7, 1179, __pyx_L1_error) } __pyx_L5:; - /* "src/lxml/serializer.pxi":1179 + /* "src/lxml/serializer.pxi":1180 * else: * raise TypeError("got invalid input value of type %s, expected string or Element" % type(content)) * self._handle_error(self._c_out.error) # <<<<<<<<<<<<<< * if not self._buffered: * tree.xmlOutputBufferFlush(self._c_out) */ - __pyx_t_11 = __pyx_f_4lxml_5etree_22_IncrementalFileWriter__handle_error(__pyx_v_self, __pyx_v_self->_c_out->error); if (unlikely(!__pyx_t_11)) __PYX_ERR(7, 1179, __pyx_L1_error) + __pyx_t_11 = __pyx_f_4lxml_5etree_22_IncrementalFileWriter__handle_error(__pyx_v_self, __pyx_v_self->_c_out->error); if (unlikely(!__pyx_t_11)) __PYX_ERR(7, 1180, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; @@ -145458,7 +145464,7 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ } __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "src/lxml/serializer.pxi":1180 + /* "src/lxml/serializer.pxi":1181 * raise TypeError("got invalid input value of type %s, expected string or Element" % type(content)) * self._handle_error(self._c_out.error) * if not self._buffered: # <<<<<<<<<<<<<< @@ -145468,7 +145474,7 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ __pyx_t_7 = ((!(__pyx_v_self->_buffered != 0)) != 0); if (__pyx_t_7) { - /* "src/lxml/serializer.pxi":1181 + /* "src/lxml/serializer.pxi":1182 * self._handle_error(self._c_out.error) * if not self._buffered: * tree.xmlOutputBufferFlush(self._c_out) # <<<<<<<<<<<<<< @@ -145477,7 +145483,7 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ */ xmlOutputBufferFlush(__pyx_v_self->_c_out); - /* "src/lxml/serializer.pxi":1180 + /* "src/lxml/serializer.pxi":1181 * raise TypeError("got invalid input value of type %s, expected string or Element" % type(content)) * self._handle_error(self._c_out.error) * if not self._buffered: # <<<<<<<<<<<<<< @@ -145517,7 +145523,7 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_10write(struct _ return __pyx_r; } -/* "src/lxml/serializer.pxi":1183 +/* "src/lxml/serializer.pxi":1184 * tree.xmlOutputBufferFlush(self._c_out) * * def flush(self): # <<<<<<<<<<<<<< @@ -145545,7 +145551,7 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_12flush(struct _ __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("flush", 0); - /* "src/lxml/serializer.pxi":1188 + /* "src/lxml/serializer.pxi":1189 * Write any pending content of the current output buffer to the stream. * """ * assert self._c_out is not NULL # <<<<<<<<<<<<<< @@ -145556,12 +145562,12 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_12flush(struct _ if (unlikely(!Py_OptimizeFlag)) { if (unlikely(!((__pyx_v_self->_c_out != NULL) != 0))) { PyErr_SetNone(PyExc_AssertionError); - __PYX_ERR(7, 1188, __pyx_L1_error) + __PYX_ERR(7, 1189, __pyx_L1_error) } } #endif - /* "src/lxml/serializer.pxi":1189 + /* "src/lxml/serializer.pxi":1190 * """ * assert self._c_out is not NULL * tree.xmlOutputBufferFlush(self._c_out) # <<<<<<<<<<<<<< @@ -145570,7 +145576,7 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_12flush(struct _ */ xmlOutputBufferFlush(__pyx_v_self->_c_out); - /* "src/lxml/serializer.pxi":1183 + /* "src/lxml/serializer.pxi":1184 * tree.xmlOutputBufferFlush(self._c_out) * * def flush(self): # <<<<<<<<<<<<<< @@ -145590,7 +145596,7 @@ static PyObject *__pyx_pf_4lxml_5etree_22_IncrementalFileWriter_12flush(struct _ return __pyx_r; } -/* "src/lxml/serializer.pxi":1191 +/* "src/lxml/serializer.pxi":1192 * tree.xmlOutputBufferFlush(self._c_out) * * cdef _close(self, bint raise_on_error): # <<<<<<<<<<<<<< @@ -145608,7 +145614,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p int __pyx_t_4; __Pyx_RefNannySetupContext("_close", 0); - /* "src/lxml/serializer.pxi":1192 + /* "src/lxml/serializer.pxi":1193 * * cdef _close(self, bint raise_on_error): * if raise_on_error: # <<<<<<<<<<<<<< @@ -145618,7 +145624,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p __pyx_t_1 = (__pyx_v_raise_on_error != 0); if (__pyx_t_1) { - /* "src/lxml/serializer.pxi":1193 + /* "src/lxml/serializer.pxi":1194 * cdef _close(self, bint raise_on_error): * if raise_on_error: * if self._status < WRITER_IN_ELEMENT: # <<<<<<<<<<<<<< @@ -145628,23 +145634,23 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p __pyx_t_1 = ((__pyx_v_self->_status < __pyx_e_4lxml_5etree_WRITER_IN_ELEMENT) != 0); if (__pyx_t_1) { - /* "src/lxml/serializer.pxi":1194 + /* "src/lxml/serializer.pxi":1195 * if raise_on_error: * if self._status < WRITER_IN_ELEMENT: * raise LxmlSyntaxError("no content written") # <<<<<<<<<<<<<< * if self._element_stack: * raise LxmlSyntaxError("pending open tags on close") */ - __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_LxmlSyntaxError); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 1194, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_LxmlSyntaxError); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 1195, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__78, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(7, 1194, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__78, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(7, 1195, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(7, 1194, __pyx_L1_error) + __PYX_ERR(7, 1195, __pyx_L1_error) - /* "src/lxml/serializer.pxi":1193 + /* "src/lxml/serializer.pxi":1194 * cdef _close(self, bint raise_on_error): * if raise_on_error: * if self._status < WRITER_IN_ELEMENT: # <<<<<<<<<<<<<< @@ -145653,7 +145659,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p */ } - /* "src/lxml/serializer.pxi":1195 + /* "src/lxml/serializer.pxi":1196 * if self._status < WRITER_IN_ELEMENT: * raise LxmlSyntaxError("no content written") * if self._element_stack: # <<<<<<<<<<<<<< @@ -145663,23 +145669,23 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p __pyx_t_1 = (__pyx_v_self->_element_stack != Py_None) && (PyList_GET_SIZE(__pyx_v_self->_element_stack) != 0); if (__pyx_t_1) { - /* "src/lxml/serializer.pxi":1196 + /* "src/lxml/serializer.pxi":1197 * raise LxmlSyntaxError("no content written") * if self._element_stack: * raise LxmlSyntaxError("pending open tags on close") # <<<<<<<<<<<<<< * error_result = self._c_out.error * if error_result == xmlerror.XML_ERR_OK: */ - __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_LxmlSyntaxError); if (unlikely(!__pyx_t_3)) __PYX_ERR(7, 1196, __pyx_L1_error) + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_LxmlSyntaxError); if (unlikely(!__pyx_t_3)) __PYX_ERR(7, 1197, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__79, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 1196, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__79, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 1197, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(7, 1196, __pyx_L1_error) + __PYX_ERR(7, 1197, __pyx_L1_error) - /* "src/lxml/serializer.pxi":1195 + /* "src/lxml/serializer.pxi":1196 * if self._status < WRITER_IN_ELEMENT: * raise LxmlSyntaxError("no content written") * if self._element_stack: # <<<<<<<<<<<<<< @@ -145688,7 +145694,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p */ } - /* "src/lxml/serializer.pxi":1192 + /* "src/lxml/serializer.pxi":1193 * * cdef _close(self, bint raise_on_error): * if raise_on_error: # <<<<<<<<<<<<<< @@ -145697,7 +145703,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p */ } - /* "src/lxml/serializer.pxi":1197 + /* "src/lxml/serializer.pxi":1198 * if self._element_stack: * raise LxmlSyntaxError("pending open tags on close") * error_result = self._c_out.error # <<<<<<<<<<<<<< @@ -145707,7 +145713,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p __pyx_t_4 = __pyx_v_self->_c_out->error; __pyx_v_error_result = __pyx_t_4; - /* "src/lxml/serializer.pxi":1198 + /* "src/lxml/serializer.pxi":1199 * raise LxmlSyntaxError("pending open tags on close") * error_result = self._c_out.error * if error_result == xmlerror.XML_ERR_OK: # <<<<<<<<<<<<<< @@ -145717,7 +145723,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p __pyx_t_1 = ((__pyx_v_error_result == XML_ERR_OK) != 0); if (__pyx_t_1) { - /* "src/lxml/serializer.pxi":1199 + /* "src/lxml/serializer.pxi":1200 * error_result = self._c_out.error * if error_result == xmlerror.XML_ERR_OK: * error_result = tree.xmlOutputBufferClose(self._c_out) # <<<<<<<<<<<<<< @@ -145726,7 +145732,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p */ __pyx_v_error_result = xmlOutputBufferClose(__pyx_v_self->_c_out); - /* "src/lxml/serializer.pxi":1200 + /* "src/lxml/serializer.pxi":1201 * if error_result == xmlerror.XML_ERR_OK: * error_result = tree.xmlOutputBufferClose(self._c_out) * if error_result > 0: # <<<<<<<<<<<<<< @@ -145736,7 +145742,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p __pyx_t_1 = ((__pyx_v_error_result > 0) != 0); if (__pyx_t_1) { - /* "src/lxml/serializer.pxi":1201 + /* "src/lxml/serializer.pxi":1202 * error_result = tree.xmlOutputBufferClose(self._c_out) * if error_result > 0: * error_result = xmlerror.XML_ERR_OK # <<<<<<<<<<<<<< @@ -145745,7 +145751,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p */ __pyx_v_error_result = XML_ERR_OK; - /* "src/lxml/serializer.pxi":1200 + /* "src/lxml/serializer.pxi":1201 * if error_result == xmlerror.XML_ERR_OK: * error_result = tree.xmlOutputBufferClose(self._c_out) * if error_result > 0: # <<<<<<<<<<<<<< @@ -145754,7 +145760,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p */ } - /* "src/lxml/serializer.pxi":1198 + /* "src/lxml/serializer.pxi":1199 * raise LxmlSyntaxError("pending open tags on close") * error_result = self._c_out.error * if error_result == xmlerror.XML_ERR_OK: # <<<<<<<<<<<<<< @@ -145764,7 +145770,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p goto __pyx_L6; } - /* "src/lxml/serializer.pxi":1203 + /* "src/lxml/serializer.pxi":1204 * error_result = xmlerror.XML_ERR_OK * else: * tree.xmlOutputBufferClose(self._c_out) # <<<<<<<<<<<<<< @@ -145776,7 +145782,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p } __pyx_L6:; - /* "src/lxml/serializer.pxi":1204 + /* "src/lxml/serializer.pxi":1205 * else: * tree.xmlOutputBufferClose(self._c_out) * self._status = WRITER_FINISHED # <<<<<<<<<<<<<< @@ -145785,7 +145791,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p */ __pyx_v_self->_status = __pyx_e_4lxml_5etree_WRITER_FINISHED; - /* "src/lxml/serializer.pxi":1205 + /* "src/lxml/serializer.pxi":1206 * tree.xmlOutputBufferClose(self._c_out) * self._status = WRITER_FINISHED * self._c_out = NULL # <<<<<<<<<<<<<< @@ -145794,7 +145800,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p */ __pyx_v_self->_c_out = NULL; - /* "src/lxml/serializer.pxi":1206 + /* "src/lxml/serializer.pxi":1207 * self._status = WRITER_FINISHED * self._c_out = NULL * del self._element_stack[:] # <<<<<<<<<<<<<< @@ -145803,11 +145809,11 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p */ if (unlikely(__pyx_v_self->_element_stack == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(7, 1206, __pyx_L1_error) + __PYX_ERR(7, 1207, __pyx_L1_error) } - if (__Pyx_PyObject_DelSlice(__pyx_v_self->_element_stack, 0, 0, NULL, NULL, NULL, 0, 0, 1) < 0) __PYX_ERR(7, 1206, __pyx_L1_error) + if (__Pyx_PyObject_DelSlice(__pyx_v_self->_element_stack, 0, 0, NULL, NULL, NULL, 0, 0, 1) < 0) __PYX_ERR(7, 1207, __pyx_L1_error) - /* "src/lxml/serializer.pxi":1207 + /* "src/lxml/serializer.pxi":1208 * self._c_out = NULL * del self._element_stack[:] * if raise_on_error: # <<<<<<<<<<<<<< @@ -145817,18 +145823,18 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p __pyx_t_1 = (__pyx_v_raise_on_error != 0); if (__pyx_t_1) { - /* "src/lxml/serializer.pxi":1208 + /* "src/lxml/serializer.pxi":1209 * del self._element_stack[:] * if raise_on_error: * self._handle_error(error_result) # <<<<<<<<<<<<<< * * cdef _handle_error(self, int error_result): */ - __pyx_t_2 = __pyx_f_4lxml_5etree_22_IncrementalFileWriter__handle_error(__pyx_v_self, __pyx_v_error_result); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 1208, __pyx_L1_error) + __pyx_t_2 = __pyx_f_4lxml_5etree_22_IncrementalFileWriter__handle_error(__pyx_v_self, __pyx_v_error_result); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 1209, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "src/lxml/serializer.pxi":1207 + /* "src/lxml/serializer.pxi":1208 * self._c_out = NULL * del self._element_stack[:] * if raise_on_error: # <<<<<<<<<<<<<< @@ -145837,7 +145843,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p */ } - /* "src/lxml/serializer.pxi":1191 + /* "src/lxml/serializer.pxi":1192 * tree.xmlOutputBufferFlush(self._c_out) * * cdef _close(self, bint raise_on_error): # <<<<<<<<<<<<<< @@ -145859,7 +145865,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__close(struct __p return __pyx_r; } -/* "src/lxml/serializer.pxi":1210 +/* "src/lxml/serializer.pxi":1211 * self._handle_error(error_result) * * cdef _handle_error(self, int error_result): # <<<<<<<<<<<<<< @@ -145876,7 +145882,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__handle_error(str PyObject *__pyx_t_4 = NULL; __Pyx_RefNannySetupContext("_handle_error", 0); - /* "src/lxml/serializer.pxi":1211 + /* "src/lxml/serializer.pxi":1212 * * cdef _handle_error(self, int error_result): * if error_result != xmlerror.XML_ERR_OK: # <<<<<<<<<<<<<< @@ -145886,7 +145892,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__handle_error(str __pyx_t_1 = ((__pyx_v_error_result != XML_ERR_OK) != 0); if (__pyx_t_1) { - /* "src/lxml/serializer.pxi":1212 + /* "src/lxml/serializer.pxi":1213 * cdef _handle_error(self, int error_result): * if error_result != xmlerror.XML_ERR_OK: * if self._target is not None: # <<<<<<<<<<<<<< @@ -145897,16 +145903,16 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__handle_error(str __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "src/lxml/serializer.pxi":1213 + /* "src/lxml/serializer.pxi":1214 * if error_result != xmlerror.XML_ERR_OK: * if self._target is not None: * self._target._exc_context._raise_if_stored() # <<<<<<<<<<<<<< * _raiseSerialisationError(error_result) * */ - __pyx_t_3 = ((struct __pyx_vtabstruct_4lxml_5etree__ExceptionContext *)__pyx_v_self->_target->_exc_context->__pyx_vtab)->_raise_if_stored(__pyx_v_self->_target->_exc_context); if (unlikely(__pyx_t_3 == -1)) __PYX_ERR(7, 1213, __pyx_L1_error) + __pyx_t_3 = ((struct __pyx_vtabstruct_4lxml_5etree__ExceptionContext *)__pyx_v_self->_target->_exc_context->__pyx_vtab)->_raise_if_stored(__pyx_v_self->_target->_exc_context); if (unlikely(__pyx_t_3 == -1)) __PYX_ERR(7, 1214, __pyx_L1_error) - /* "src/lxml/serializer.pxi":1212 + /* "src/lxml/serializer.pxi":1213 * cdef _handle_error(self, int error_result): * if error_result != xmlerror.XML_ERR_OK: * if self._target is not None: # <<<<<<<<<<<<<< @@ -145915,18 +145921,18 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__handle_error(str */ } - /* "src/lxml/serializer.pxi":1214 + /* "src/lxml/serializer.pxi":1215 * if self._target is not None: * self._target._exc_context._raise_if_stored() * _raiseSerialisationError(error_result) # <<<<<<<<<<<<<< * * @cython.final */ - __pyx_t_4 = __pyx_f_4lxml_5etree__raiseSerialisationError(__pyx_v_error_result); if (unlikely(!__pyx_t_4)) __PYX_ERR(7, 1214, __pyx_L1_error) + __pyx_t_4 = __pyx_f_4lxml_5etree__raiseSerialisationError(__pyx_v_error_result); if (unlikely(!__pyx_t_4)) __PYX_ERR(7, 1215, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "src/lxml/serializer.pxi":1211 + /* "src/lxml/serializer.pxi":1212 * * cdef _handle_error(self, int error_result): * if error_result != xmlerror.XML_ERR_OK: # <<<<<<<<<<<<<< @@ -145935,7 +145941,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__handle_error(str */ } - /* "src/lxml/serializer.pxi":1210 + /* "src/lxml/serializer.pxi":1211 * self._handle_error(error_result) * * cdef _handle_error(self, int error_result): # <<<<<<<<<<<<<< @@ -145956,7 +145962,7 @@ static PyObject *__pyx_f_4lxml_5etree_22_IncrementalFileWriter__handle_error(str return __pyx_r; } -/* "src/lxml/serializer.pxi":1223 +/* "src/lxml/serializer.pxi":1224 * cdef _IncrementalFileWriter _writer * * def __cinit__(self, _IncrementalFileWriter writer not None, element_config): # <<<<<<<<<<<<<< @@ -145992,11 +145998,11 @@ static int __pyx_pw_4lxml_5etree_18_FileWriterElement_1__cinit__(PyObject *__pyx case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_element_config)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); __PYX_ERR(7, 1223, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); __PYX_ERR(7, 1224, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(7, 1223, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(7, 1224, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; @@ -146009,13 +146015,13 @@ static int __pyx_pw_4lxml_5etree_18_FileWriterElement_1__cinit__(PyObject *__pyx } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(7, 1223, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(7, 1224, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("lxml.etree._FileWriterElement.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_writer), __pyx_ptype_4lxml_5etree__IncrementalFileWriter, 0, "writer", 0))) __PYX_ERR(7, 1223, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_writer), __pyx_ptype_4lxml_5etree__IncrementalFileWriter, 0, "writer", 0))) __PYX_ERR(7, 1224, __pyx_L1_error) __pyx_r = __pyx_pf_4lxml_5etree_18_FileWriterElement___cinit__(((struct __pyx_obj_4lxml_5etree__FileWriterElement *)__pyx_v_self), __pyx_v_writer, __pyx_v_element_config); /* function exit code */ @@ -146032,7 +146038,7 @@ static int __pyx_pf_4lxml_5etree_18_FileWriterElement___cinit__(struct __pyx_obj __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__cinit__", 0); - /* "src/lxml/serializer.pxi":1224 + /* "src/lxml/serializer.pxi":1225 * * def __cinit__(self, _IncrementalFileWriter writer not None, element_config): * self._writer = writer # <<<<<<<<<<<<<< @@ -146045,7 +146051,7 @@ static int __pyx_pf_4lxml_5etree_18_FileWriterElement___cinit__(struct __pyx_obj __Pyx_DECREF(((PyObject *)__pyx_v_self->_writer)); __pyx_v_self->_writer = __pyx_v_writer; - /* "src/lxml/serializer.pxi":1225 + /* "src/lxml/serializer.pxi":1226 * def __cinit__(self, _IncrementalFileWriter writer not None, element_config): * self._writer = writer * self._element = element_config # <<<<<<<<<<<<<< @@ -146058,7 +146064,7 @@ static int __pyx_pf_4lxml_5etree_18_FileWriterElement___cinit__(struct __pyx_obj __Pyx_DECREF(__pyx_v_self->_element); __pyx_v_self->_element = __pyx_v_element_config; - /* "src/lxml/serializer.pxi":1223 + /* "src/lxml/serializer.pxi":1224 * cdef _IncrementalFileWriter _writer * * def __cinit__(self, _IncrementalFileWriter writer not None, element_config): # <<<<<<<<<<<<<< @@ -146072,7 +146078,7 @@ static int __pyx_pf_4lxml_5etree_18_FileWriterElement___cinit__(struct __pyx_obj return __pyx_r; } -/* "src/lxml/serializer.pxi":1227 +/* "src/lxml/serializer.pxi":1228 * self._element = element_config * * def __enter__(self): # <<<<<<<<<<<<<< @@ -146101,7 +146107,7 @@ static PyObject *__pyx_pf_4lxml_5etree_18_FileWriterElement_2__enter__(struct __ PyObject *__pyx_t_2 = NULL; __Pyx_RefNannySetupContext("__enter__", 0); - /* "src/lxml/serializer.pxi":1228 + /* "src/lxml/serializer.pxi":1229 * * def __enter__(self): * self._writer._write_start_element(self._element) # <<<<<<<<<<<<<< @@ -146110,12 +146116,12 @@ static PyObject *__pyx_pf_4lxml_5etree_18_FileWriterElement_2__enter__(struct __ */ __pyx_t_1 = __pyx_v_self->_element; __Pyx_INCREF(__pyx_t_1); - __pyx_t_2 = __pyx_f_4lxml_5etree_22_IncrementalFileWriter__write_start_element(__pyx_v_self->_writer, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 1228, __pyx_L1_error) + __pyx_t_2 = __pyx_f_4lxml_5etree_22_IncrementalFileWriter__write_start_element(__pyx_v_self->_writer, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 1229, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "src/lxml/serializer.pxi":1227 + /* "src/lxml/serializer.pxi":1228 * self._element = element_config * * def __enter__(self): # <<<<<<<<<<<<<< @@ -146137,7 +146143,7 @@ static PyObject *__pyx_pf_4lxml_5etree_18_FileWriterElement_2__enter__(struct __ return __pyx_r; } -/* "src/lxml/serializer.pxi":1230 +/* "src/lxml/serializer.pxi":1231 * self._writer._write_start_element(self._element) * * def __exit__(self, exc_type, exc_val, exc_tb): # <<<<<<<<<<<<<< @@ -146175,16 +146181,16 @@ static PyObject *__pyx_pw_4lxml_5etree_18_FileWriterElement_5__exit__(PyObject * case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_exc_val)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__exit__", 1, 3, 3, 1); __PYX_ERR(7, 1230, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__exit__", 1, 3, 3, 1); __PYX_ERR(7, 1231, __pyx_L3_error) } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_exc_tb)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__exit__", 1, 3, 3, 2); __PYX_ERR(7, 1230, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__exit__", 1, 3, 3, 2); __PYX_ERR(7, 1231, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__exit__") < 0)) __PYX_ERR(7, 1230, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__exit__") < 0)) __PYX_ERR(7, 1231, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; @@ -146199,7 +146205,7 @@ static PyObject *__pyx_pw_4lxml_5etree_18_FileWriterElement_5__exit__(PyObject * } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__exit__", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(7, 1230, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__exit__", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(7, 1231, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("lxml.etree._FileWriterElement.__exit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -146219,19 +146225,19 @@ static PyObject *__pyx_pf_4lxml_5etree_18_FileWriterElement_4__exit__(struct __p PyObject *__pyx_t_2 = NULL; __Pyx_RefNannySetupContext("__exit__", 0); - /* "src/lxml/serializer.pxi":1231 + /* "src/lxml/serializer.pxi":1232 * * def __exit__(self, exc_type, exc_val, exc_tb): * self._writer._write_end_element(self._element) # <<<<<<<<<<<<<< */ __pyx_t_1 = __pyx_v_self->_element; __Pyx_INCREF(__pyx_t_1); - __pyx_t_2 = __pyx_f_4lxml_5etree_22_IncrementalFileWriter__write_end_element(__pyx_v_self->_writer, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 1231, __pyx_L1_error) + __pyx_t_2 = __pyx_f_4lxml_5etree_22_IncrementalFileWriter__write_end_element(__pyx_v_self->_writer, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(7, 1232, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "src/lxml/serializer.pxi":1230 + /* "src/lxml/serializer.pxi":1231 * self._writer._write_start_element(self._element) * * def __exit__(self, exc_type, exc_val, exc_tb): # <<<<<<<<<<<<<< @@ -216633,7 +216639,6 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_b_http_www_w3_org_1999_XSL_Transfo, __pyx_k_http_www_w3_org_1999_XSL_Transfo, sizeof(__pyx_k_http_www_w3_org_1999_XSL_Transfo), 0, 0, 0, 0}, {&__pyx_kp_u_http_www_w3_org_1999_XSL_Transfo, __pyx_k_http_www_w3_org_1999_XSL_Transfo, sizeof(__pyx_k_http_www_w3_org_1999_XSL_Transfo), 0, 1, 0, 0}, {&__pyx_kp_b_http_www_w3_org_1999_xhtml, __pyx_k_http_www_w3_org_1999_xhtml, sizeof(__pyx_k_http_www_w3_org_1999_xhtml), 0, 0, 0, 0}, - {&__pyx_kp_s_http_www_w3_org_1999_xhtml, __pyx_k_http_www_w3_org_1999_xhtml, sizeof(__pyx_k_http_www_w3_org_1999_xhtml), 0, 0, 1, 0}, {&__pyx_kp_b_http_www_w3_org_2001_XMLSchema, __pyx_k_http_www_w3_org_2001_XMLSchema, sizeof(__pyx_k_http_www_w3_org_2001_XMLSchema), 0, 0, 0, 0}, {&__pyx_kp_u_http_www_w3_org_2001_XMLSchema, __pyx_k_http_www_w3_org_2001_XMLSchema, sizeof(__pyx_k_http_www_w3_org_2001_XMLSchema), 0, 1, 0, 0}, {&__pyx_kp_b_http_www_w3_org_2001_XMLSchema_i, __pyx_k_http_www_w3_org_2001_XMLSchema_i, sizeof(__pyx_k_http_www_w3_org_2001_XMLSchema_i), 0, 0, 0, 0}, @@ -216915,7 +216920,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_s_s_s_object_name_r_type_r_occur, __pyx_k_s_s_object_name_r_type_r_occur, sizeof(__pyx_k_s_s_object_name_r_type_r_occur), 0, 0, 1, 0}, {&__pyx_kp_u_s_w_s_s, __pyx_k_s_w_s_s, sizeof(__pyx_k_s_w_s_s), 0, 1, 0, 0}, {&__pyx_n_s_schema, __pyx_k_schema, sizeof(__pyx_k_schema), 0, 0, 1, 1}, - {&__pyx_n_s_script, __pyx_k_script, sizeof(__pyx_k_script), 0, 0, 1, 1}, + {&__pyx_n_b_script, __pyx_k_script, sizeof(__pyx_k_script), 0, 0, 0, 1}, {&__pyx_n_s_search, __pyx_k_search, sizeof(__pyx_k_search), 0, 0, 1, 1}, {&__pyx_n_s_self, __pyx_k_self, sizeof(__pyx_k_self), 0, 0, 1, 1}, {&__pyx_n_s_self_node, __pyx_k_self_node, sizeof(__pyx_k_self_node), 0, 0, 1, 1}, @@ -216960,6 +216965,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_strip_tags, __pyx_k_strip_tags, sizeof(__pyx_k_strip_tags), 0, 0, 1, 1}, {&__pyx_n_s_strparam, __pyx_k_strparam, sizeof(__pyx_k_strparam), 0, 0, 1, 1}, {&__pyx_n_s_strval, __pyx_k_strval, sizeof(__pyx_k_strval), 0, 0, 1, 1}, + {&__pyx_n_b_style, __pyx_k_style, sizeof(__pyx_k_style), 0, 0, 0, 1}, {&__pyx_n_s_style, __pyx_k_style, sizeof(__pyx_k_style), 0, 0, 1, 1}, {&__pyx_n_s_sub, __pyx_k_sub, sizeof(__pyx_k_sub), 0, 0, 1, 1}, {&__pyx_n_s_super, __pyx_k_super, sizeof(__pyx_k_super), 0, 0, 1, 1}, @@ -217719,36 +217725,36 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GOTREF(__pyx_tuple__76); __Pyx_GIVEREF(__pyx_tuple__76); - /* "src/lxml/serializer.pxi":1170 + /* "src/lxml/serializer.pxi":1171 * elif iselement(content): * if self._status > WRITER_IN_ELEMENT: * raise LxmlSyntaxError("cannot append trailing element to complete XML document") # <<<<<<<<<<<<<< * _writeNodeToBuffer(self._c_out, (<_Element>content)._c_node, * self._c_encoding, NULL, c_method, */ - __pyx_tuple__77 = PyTuple_Pack(1, __pyx_kp_s_cannot_append_trailing_element_t); if (unlikely(!__pyx_tuple__77)) __PYX_ERR(7, 1170, __pyx_L1_error) + __pyx_tuple__77 = PyTuple_Pack(1, __pyx_kp_s_cannot_append_trailing_element_t); if (unlikely(!__pyx_tuple__77)) __PYX_ERR(7, 1171, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__77); __Pyx_GIVEREF(__pyx_tuple__77); - /* "src/lxml/serializer.pxi":1194 + /* "src/lxml/serializer.pxi":1195 * if raise_on_error: * if self._status < WRITER_IN_ELEMENT: * raise LxmlSyntaxError("no content written") # <<<<<<<<<<<<<< * if self._element_stack: * raise LxmlSyntaxError("pending open tags on close") */ - __pyx_tuple__78 = PyTuple_Pack(1, __pyx_kp_s_no_content_written); if (unlikely(!__pyx_tuple__78)) __PYX_ERR(7, 1194, __pyx_L1_error) + __pyx_tuple__78 = PyTuple_Pack(1, __pyx_kp_s_no_content_written); if (unlikely(!__pyx_tuple__78)) __PYX_ERR(7, 1195, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__78); __Pyx_GIVEREF(__pyx_tuple__78); - /* "src/lxml/serializer.pxi":1196 + /* "src/lxml/serializer.pxi":1197 * raise LxmlSyntaxError("no content written") * if self._element_stack: * raise LxmlSyntaxError("pending open tags on close") # <<<<<<<<<<<<<< * error_result = self._c_out.error * if error_result == xmlerror.XML_ERR_OK: */ - __pyx_tuple__79 = PyTuple_Pack(1, __pyx_kp_s_pending_open_tags_on_close); if (unlikely(!__pyx_tuple__79)) __PYX_ERR(7, 1196, __pyx_L1_error) + __pyx_tuple__79 = PyTuple_Pack(1, __pyx_kp_s_pending_open_tags_on_close); if (unlikely(!__pyx_tuple__79)) __PYX_ERR(7, 1197, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__79); __Pyx_GIVEREF(__pyx_tuple__79); @@ -220446,40 +220452,40 @@ static int __Pyx_InitCachedConstants(void) { __Pyx_GIVEREF(__pyx_tuple__501); __pyx_codeobj__502 = (PyObject*)__Pyx_PyCode_New(1, 3, 10, 0, CO_VARARGS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__501, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_stefan_source_Python_lxml_10, __pyx_n_s_write, 1143, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__502)) __PYX_ERR(7, 1143, __pyx_L1_error) - /* "src/lxml/serializer.pxi":1183 + /* "src/lxml/serializer.pxi":1184 * tree.xmlOutputBufferFlush(self._c_out) * * def flush(self): # <<<<<<<<<<<<<< * """flush(self) * */ - __pyx_tuple__503 = PyTuple_Pack(1, __pyx_n_s_self); if (unlikely(!__pyx_tuple__503)) __PYX_ERR(7, 1183, __pyx_L1_error) + __pyx_tuple__503 = PyTuple_Pack(1, __pyx_n_s_self); if (unlikely(!__pyx_tuple__503)) __PYX_ERR(7, 1184, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__503); __Pyx_GIVEREF(__pyx_tuple__503); - __pyx_codeobj__504 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__503, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_stefan_source_Python_lxml_10, __pyx_n_s_flush, 1183, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__504)) __PYX_ERR(7, 1183, __pyx_L1_error) + __pyx_codeobj__504 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__503, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_stefan_source_Python_lxml_10, __pyx_n_s_flush, 1184, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__504)) __PYX_ERR(7, 1184, __pyx_L1_error) - /* "src/lxml/serializer.pxi":1227 + /* "src/lxml/serializer.pxi":1228 * self._element = element_config * * def __enter__(self): # <<<<<<<<<<<<<< * self._writer._write_start_element(self._element) * */ - __pyx_tuple__505 = PyTuple_Pack(1, __pyx_n_s_self); if (unlikely(!__pyx_tuple__505)) __PYX_ERR(7, 1227, __pyx_L1_error) + __pyx_tuple__505 = PyTuple_Pack(1, __pyx_n_s_self); if (unlikely(!__pyx_tuple__505)) __PYX_ERR(7, 1228, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__505); __Pyx_GIVEREF(__pyx_tuple__505); - __pyx_codeobj__506 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__505, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_stefan_source_Python_lxml_10, __pyx_n_s_enter, 1227, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__506)) __PYX_ERR(7, 1227, __pyx_L1_error) + __pyx_codeobj__506 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__505, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_stefan_source_Python_lxml_10, __pyx_n_s_enter, 1228, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__506)) __PYX_ERR(7, 1228, __pyx_L1_error) - /* "src/lxml/serializer.pxi":1230 + /* "src/lxml/serializer.pxi":1231 * self._writer._write_start_element(self._element) * * def __exit__(self, exc_type, exc_val, exc_tb): # <<<<<<<<<<<<<< * self._writer._write_end_element(self._element) */ - __pyx_tuple__507 = PyTuple_Pack(4, __pyx_n_s_self, __pyx_n_s_exc_type, __pyx_n_s_exc_val, __pyx_n_s_exc_tb); if (unlikely(!__pyx_tuple__507)) __PYX_ERR(7, 1230, __pyx_L1_error) + __pyx_tuple__507 = PyTuple_Pack(4, __pyx_n_s_self, __pyx_n_s_exc_type, __pyx_n_s_exc_val, __pyx_n_s_exc_tb); if (unlikely(!__pyx_tuple__507)) __PYX_ERR(7, 1231, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__507); __Pyx_GIVEREF(__pyx_tuple__507); - __pyx_codeobj__508 = (PyObject*)__Pyx_PyCode_New(4, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__507, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_stefan_source_Python_lxml_10, __pyx_n_s_exit, 1230, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__508)) __PYX_ERR(7, 1230, __pyx_L1_error) + __pyx_codeobj__508 = (PyObject*)__Pyx_PyCode_New(4, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__507, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_stefan_source_Python_lxml_10, __pyx_n_s_exit, 1231, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__508)) __PYX_ERR(7, 1231, __pyx_L1_error) /* "src/lxml/iterparse.pxi":147 * return self._parser.version @@ -222321,7 +222327,7 @@ PyMODINIT_FUNC PyInit_etree(void) __pyx_type_4lxml_5etree__IncrementalFileWriter.tp_print = 0; if (__Pyx_SetVtable(__pyx_type_4lxml_5etree__IncrementalFileWriter.tp_dict, __pyx_vtabptr_4lxml_5etree__IncrementalFileWriter) < 0) __PYX_ERR(7, 944, __pyx_L1_error) __pyx_ptype_4lxml_5etree__IncrementalFileWriter = &__pyx_type_4lxml_5etree__IncrementalFileWriter; - if (PyType_Ready(&__pyx_type_4lxml_5etree__FileWriterElement) < 0) __PYX_ERR(7, 1219, __pyx_L1_error) + if (PyType_Ready(&__pyx_type_4lxml_5etree__FileWriterElement) < 0) __PYX_ERR(7, 1220, __pyx_L1_error) __pyx_type_4lxml_5etree__FileWriterElement.tp_print = 0; __pyx_ptype_4lxml_5etree__FileWriterElement = &__pyx_type_4lxml_5etree__FileWriterElement; __pyx_vtabptr_4lxml_5etree_iterparse = &__pyx_vtable_4lxml_5etree_iterparse; @@ -227901,41 +227907,41 @@ PyMODINIT_FUNC PyInit_etree(void) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; PyType_Modified(__pyx_ptype_4lxml_5etree__IncrementalFileWriter); - /* "src/lxml/serializer.pxi":1183 + /* "src/lxml/serializer.pxi":1184 * tree.xmlOutputBufferFlush(self._c_out) * * def flush(self): # <<<<<<<<<<<<<< * """flush(self) * */ - __pyx_t_6 = __Pyx_CyFunction_NewEx(&__pyx_mdef_4lxml_5etree_22_IncrementalFileWriter_13flush, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_IncrementalFileWriter_flush, NULL, __pyx_n_s_lxml_etree, __pyx_d, ((PyObject *)__pyx_codeobj__504)); if (unlikely(!__pyx_t_6)) __PYX_ERR(7, 1183, __pyx_L1_error) + __pyx_t_6 = __Pyx_CyFunction_NewEx(&__pyx_mdef_4lxml_5etree_22_IncrementalFileWriter_13flush, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_IncrementalFileWriter_flush, NULL, __pyx_n_s_lxml_etree, __pyx_d, ((PyObject *)__pyx_codeobj__504)); if (unlikely(!__pyx_t_6)) __PYX_ERR(7, 1184, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - if (PyDict_SetItem((PyObject *)__pyx_ptype_4lxml_5etree__IncrementalFileWriter->tp_dict, __pyx_n_s_flush, __pyx_t_6) < 0) __PYX_ERR(7, 1183, __pyx_L1_error) + if (PyDict_SetItem((PyObject *)__pyx_ptype_4lxml_5etree__IncrementalFileWriter->tp_dict, __pyx_n_s_flush, __pyx_t_6) < 0) __PYX_ERR(7, 1184, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; PyType_Modified(__pyx_ptype_4lxml_5etree__IncrementalFileWriter); - /* "src/lxml/serializer.pxi":1227 + /* "src/lxml/serializer.pxi":1228 * self._element = element_config * * def __enter__(self): # <<<<<<<<<<<<<< * self._writer._write_start_element(self._element) * */ - __pyx_t_6 = __Pyx_CyFunction_NewEx(&__pyx_mdef_4lxml_5etree_18_FileWriterElement_3__enter__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_FileWriterElement___enter, NULL, __pyx_n_s_lxml_etree, __pyx_d, ((PyObject *)__pyx_codeobj__506)); if (unlikely(!__pyx_t_6)) __PYX_ERR(7, 1227, __pyx_L1_error) + __pyx_t_6 = __Pyx_CyFunction_NewEx(&__pyx_mdef_4lxml_5etree_18_FileWriterElement_3__enter__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_FileWriterElement___enter, NULL, __pyx_n_s_lxml_etree, __pyx_d, ((PyObject *)__pyx_codeobj__506)); if (unlikely(!__pyx_t_6)) __PYX_ERR(7, 1228, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - if (PyDict_SetItem((PyObject *)__pyx_ptype_4lxml_5etree__FileWriterElement->tp_dict, __pyx_n_s_enter, __pyx_t_6) < 0) __PYX_ERR(7, 1227, __pyx_L1_error) + if (PyDict_SetItem((PyObject *)__pyx_ptype_4lxml_5etree__FileWriterElement->tp_dict, __pyx_n_s_enter, __pyx_t_6) < 0) __PYX_ERR(7, 1228, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; PyType_Modified(__pyx_ptype_4lxml_5etree__FileWriterElement); - /* "src/lxml/serializer.pxi":1230 + /* "src/lxml/serializer.pxi":1231 * self._writer._write_start_element(self._element) * * def __exit__(self, exc_type, exc_val, exc_tb): # <<<<<<<<<<<<<< * self._writer._write_end_element(self._element) */ - __pyx_t_6 = __Pyx_CyFunction_NewEx(&__pyx_mdef_4lxml_5etree_18_FileWriterElement_5__exit__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_FileWriterElement___exit, NULL, __pyx_n_s_lxml_etree, __pyx_d, ((PyObject *)__pyx_codeobj__508)); if (unlikely(!__pyx_t_6)) __PYX_ERR(7, 1230, __pyx_L1_error) + __pyx_t_6 = __Pyx_CyFunction_NewEx(&__pyx_mdef_4lxml_5etree_18_FileWriterElement_5__exit__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_FileWriterElement___exit, NULL, __pyx_n_s_lxml_etree, __pyx_d, ((PyObject *)__pyx_codeobj__508)); if (unlikely(!__pyx_t_6)) __PYX_ERR(7, 1231, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - if (PyDict_SetItem((PyObject *)__pyx_ptype_4lxml_5etree__FileWriterElement->tp_dict, __pyx_n_s_exit, __pyx_t_6) < 0) __PYX_ERR(7, 1230, __pyx_L1_error) + if (PyDict_SetItem((PyObject *)__pyx_ptype_4lxml_5etree__FileWriterElement->tp_dict, __pyx_n_s_exit, __pyx_t_6) < 0) __PYX_ERR(7, 1231, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; PyType_Modified(__pyx_ptype_4lxml_5etree__FileWriterElement); diff --git a/src/lxml/serializer.pxi b/src/lxml/serializer.pxi index d16b08a1..8cee18d8 100644 --- a/src/lxml/serializer.pxi +++ b/src/lxml/serializer.pxi @@ -1159,9 +1159,10 @@ cdef class _IncrementalFileWriter: content = _utf8(content) ns, name, _, _ = self._element_stack[-1] - if c_method == OUTPUT_METHOD_HTML and \ - ns in (None, 'http://www.w3.org/1999/xhtml') and name in ('script', 'style'): - tree.xmlOutputBufferWrite(self._c_out, len(content), content) + if (c_method == OUTPUT_METHOD_HTML and + ns in (None, b'http://www.w3.org/1999/xhtml') and + name in (b'script', b'style')): + tree.xmlOutputBufferWrite(self._c_out, len(content), _cstr(content)) else: tree.xmlOutputBufferWriteEscape(self._c_out, _xcstr(content), NULL) diff --git a/src/lxml/tests/common_imports.py b/src/lxml/tests/common_imports.py index 85b1157d..3a73a29e 100644 --- a/src/lxml/tests/common_imports.py +++ b/src/lxml/tests/common_imports.py @@ -117,12 +117,15 @@ def _get_caller_relative_path(filename, frame_depth=2): from io import StringIO +unichr_escape = re.compile(r'\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}') + if sys.version_info[0] >= 3: # Python 3 from builtins import str as unicode + from codecs import unicode_escape_decode _chr = chr def _str(s, encoding="UTF-8"): - return s + return unichr_escape.sub(lambda x: unicode_escape_decode(x.group(0))[0], s) def _bytes(s, encoding="UTF-8"): return s.encode(encoding) from io import BytesIO as _BytesIO @@ -144,8 +147,6 @@ if sys.version_info[0] >= 3: doctests, {}, os.path.basename(filename), filename, 0)) else: # Python 2 - unichr_escape = re.compile(r'\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}') - from __builtin__ import unicode _chr = unichr def _str(s, encoding="UTF-8"): @@ -174,12 +175,16 @@ else: try: skipIf = unittest.skipIf except AttributeError: - def skipIf(condition, why, - _skip=lambda test_method: None, - _keep=lambda test_method: test_method): + def skipIf(condition, why): + def _skip(thing): + import types + if isinstance(thing, (type, types.ClassType)): + return type(thing.__name__, (object,), {}) + else: + return None if condition: return _skip - return _keep + return lambda thing: thing class HelperTestCase(unittest.TestCase): diff --git a/src/lxml/tests/test_incremental_xmlfile.py b/src/lxml/tests/test_incremental_xmlfile.py index 7a7e0730..867db4a8 100644 --- a/src/lxml/tests/test_incremental_xmlfile.py +++ b/src/lxml/tests/test_incremental_xmlfile.py @@ -2,11 +2,9 @@ """ Tests for the incremental XML serialisation API. - -Tests require Python 2.5 or later. """ -from __future__ import with_statement +from __future__ import with_statement, absolute_import import unittest import tempfile, os, sys @@ -15,7 +13,7 @@ this_dir = os.path.dirname(__file__) if this_dir not in sys.path: sys.path.insert(0, this_dir) # needed for Py3 -from common_imports import etree, BytesIO, HelperTestCase, skipIf, _str +from .common_imports import etree, BytesIO, HelperTestCase, skipIf, _str class _XmlFileTestCaseBase(HelperTestCase): @@ -286,6 +284,7 @@ class TempXmlFileTestCase(_XmlFileTestCaseBase): self._file = tempfile.TemporaryFile() +@skipIf(sys.platform.startswith("win"), "Can't reopen temporary files on Windows") class TempPathXmlFileTestCase(_XmlFileTestCaseBase): def setUp(self): self._tmpfile = tempfile.NamedTemporaryFile() diff --git a/tools/manylinux/build-wheels.sh b/tools/manylinux/build-wheels.sh index 5c92d7af..308c38a9 100755 --- a/tools/manylinux/build-wheels.sh +++ b/tools/manylinux/build-wheels.sh @@ -65,7 +65,8 @@ repair_wheels() { } show_wheels() { - ls -l $WHEELHOUSE + filename=${SDIST##*/} + ls -l $WHEELHOUSE/${filename%%.tar.gz} } prepare_system diff --git a/version.txt b/version.txt index 0b2eb36f..c1e43e6d 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.7.2 +3.7.3