- 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+.
-
- 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.
- 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.
- 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).
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.