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".
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 severly 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.
* 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 honout the 'recover' option on parse errors.
* Diverting the error logging to Python's logging system was broken.
Require setuptools-0.6c11 as it fails at least with newer Python 2.6
otherwise.
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.
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).
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).
lxml is a Pythonic binding for the libxml2 and libxslt libraries.
It is unique in that it combines the speed and feature completeness
of these libraries with the simplicity of a native Python API,
mostly compatible but superior to the well-known ElementTree API.