Skip to main content

XPath 1.0/2.0 parsers and selectors for ElementTree and lxml

Project description

https://img.shields.io/pypi/v/elementpath.svg https://img.shields.io/pypi/pyversions/elementpath.svg https://img.shields.io/pypi/implementation/elementpath.svg MIT License https://travis-ci.org/sissaschool/elementpath.svg?branch=master https://img.shields.io/pypi/dm/elementpath.svg https://img.shields.io/badge/Maintained%3F-yes-green.svg

The proposal of this package is to provide XPath 1.0 and 2.0 selectors for Python’s ElementTree XML data structures, both for the standard ElementTree library and for the lxml.etree library.

For lxml.etree this package can be useful for providing XPath 2.0 selectors, because lxml.etree already has it’s own implementation of XPath 1.0.

Installation and usage

You can install the package with pip in a Python 3.5+ environment:

pip install elementpath

For using it import the package and apply the selectors on ElementTree nodes:

>>> import elementpath
>>> from xml.etree import ElementTree
>>> root = ElementTree.XML('<A><B1/><B2><C1/><C2/><C3/></B2></A>')
>>> elementpath.select(root, '/A/B2/*')
[<Element 'C1' at ...>, <Element 'C2' at ...>, <Element 'C3' at ...>]

The select API provides the standard XPath result format that is a list or an elementary datatype’s value. If you want only to iterate over results you can use the generator function iter_select that accepts the same arguments of select.

The selectors API works also using XML data trees based on the lxml.etree library:

>>> import elementpath
>>> import lxml.etree as etree
>>> root = etree.XML('<A><B1/><B2><C1/><C2/><C3/></B2></A>')
>>> elementpath.select(root, '/A/B2/*')
[<Element C1 at ...>, <Element C2 at ...>, <Element C3 at ...>]

When you need to apply the same XPath expression to several XML data you can also use the Selector class, creating an instance and then using it to apply the path on distinct XML data:

>>> import elementpath
>>> import lxml.etree as etree
>>> selector = elementpath.Selector('/A/*/*')
>>> root = etree.XML('<A><B1/><B2><C1/><C2/><C3/></B2></A>')
>>> selector.select(root)
[<Element C1 at ...>, <Element C2 at ...>, <Element C3 at ...>]
>>> root = etree.XML('<A><B1><C0/></B1><B2><C1/><C2/><C3/></B2></A>')
>>> selector.select(root)
[<Element C0 at ...>, <Element C1 at ...>, <Element C2 at ...>, <Element C3 at ...>]

Public API classes and functions are described into the elementpath manual on the “Read the Docs” site.

Contributing

You can contribute to this package reporting bugs, using the issue tracker or by a pull request. In case you open an issue please try to provide a test or test data for reproducing the wrong behaviour. The provided testing code shall be added to the tests of the package.

The XPath parsers are based on an implementation of the Pratt’s Top Down Operator Precedence parser. The implemented parser includes some lookup-ahead features, helpers for registering tokens and for extending language implementations. Also the token class has been generalized using a MutableSequence as base class. See tdop_parser.py for the basic internal classes and xpath1_parser.py for extensions and for a basic usage of the parser.

If you like you can use the basic parser and tokens provided by the tdop_parser.py module to implement other types of parsers (I think it could be also a funny exercise!).

License

This software is distributed under the terms of the MIT License. See the file ‘LICENSE’ in the root directory of the present distribution, or http://opensource.org/licenses/MIT.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

elementpath-2.0.0.tar.gz (149.2 kB view details)

Uploaded Source

Built Distribution

elementpath-2.0.0-py3-none-any.whl (83.5 kB view details)

Uploaded Python 3

File details

Details for the file elementpath-2.0.0.tar.gz.

File metadata

  • Download URL: elementpath-2.0.0.tar.gz
  • Upload date:
  • Size: 149.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.8.3

File hashes

Hashes for elementpath-2.0.0.tar.gz
Algorithm Hash digest
SHA256 5bbce8de94551c84eb8371dae8f0c7a3850385b1f9d8e9adf9c801bb7c722ffe
MD5 af386b2dbd8d131860d7dc6c32b91175
BLAKE2b-256 c9e8e5b9ad6cfb6b9831e98f88cba5d3bf193eef62a08fa12dd06387492779e0

See more details on using hashes here.

File details

Details for the file elementpath-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: elementpath-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 83.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.8.3

File hashes

Hashes for elementpath-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6107d2f70aa571ef5b081ed99da354bc066c1834815276b060f7496d2bd80dcf
MD5 b1a37c64e48ac005e7638ce215c765a9
BLAKE2b-256 edb4678a76fc569c167c1a89ef805044dbf9644844f4e9e737662e85a0a12ca6

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page