Skip to main content

CSS selector syntax for python minidom and DOM implementations.

Short example

Provided an HTML file sample.html the following code will query some elements and return them as minidom Elements. In case of multiple elements (select_all) a simple python list is returned (instead of a minidom NodeList).

from xml.dom.minidom import parse
from dom_query import select, select_all

tree = parse("test/html/sample.html")

# Title element
title = select(tree, "title")

# Every P element
paragraphs = select_all(tree, "p")

# Element with type P and ID equal to "summary"
summary = select(tree, "p#summary")

# Every element with class "wide"
wide_elements = select_all(tree, ".wide")

Supported CSS syntax

Only a subset of CSS syntax is supported:

  • Compound selectors (comma separator),

  • element type and id,

  • classes presence,

  • attributes match (presence and all the other operators),

  • combinators (descendant, sibling, subsequent, child).

Some supported selectors:

p#abstract[lang|=en]
p[data-user="john"]
div > p + p, article > p + p
script[type="text/data"]
header > li ul, footer > li ul
section h1 ~ p, article h2 ~ p

Internals and implementation

Every query is compiled and cached for subsequent use.

Lexer

The first stage is tokenization (lexer.py lexer) which is loosely based on the W3C selector lexer. The differences are mainly to make the tokenizer compatible with regular expressions and to strip every unnecessary features.

Parser

Then follows the parsing stage (parser.py parse) which produce a simple AST from the tokens. The parser is, just like the tokenizer, a simplified version of the standard one. It is a single function which implements a descent parser. The AST is a tuple of tuples and maps in a relatively close way the given query.

Compiler

The last stage is the compiler (compiler.py compile). It translates the AST into a sequence of simple actions to be performed in order to select the matching elements. Once compiled it is saved in cache and will be reused whenever the same query is seen again.

Virtual machine

The opcodes are executed by (vm.py execute). This function takes a starting element, a sequence of opcodes, and an api. The api is dict-like object. Every key corresponds to a function which implements an opcode. The default api is minidom_api.py api.

DOM API

Every function in the api is either a filter (actual filtering of nodes) or a generator (combinators expansion). The only two opcodes which don’t follows this rule are YIELD (return elements found so far) and RESET (reload the original element node after a CSS comma).

In case of other dom implementations it should be sufficient to write a new api and pass it to execute (or select*) upon querying.

Code quality and stability

The code is far from complete. It is tested but there are minor issues (attribute match doesn’t follow the specs verbatim).

Feel free to contribute.

Release files for dom-query 0.0.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dom-query 0.0.4
File Size Uploaded
dom_query-0.0.4.tar.gz 10.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dom-query 0.0.4
File Interpreter ABI Platform
dom_query-0.0.4-py3-none-any.whl Python 3 none any Details

Total release size: 23.8 kB

Release files / dom_query-0.0.4.tar.gz

Download URL dom_query-0.0.4.tar.gz
Size 10.8 kB
Tags Source
SHA-256 checksum
How to use checksums
4c71c135be6b1ce50f67ee9fcb9a2ac8ec87e96354e10f2c7b9b716fd531c3c2
BLAKE2b-256 checksum
How to use checksums
d75d1b55814987dc4ec3580c57e0833e2d929d80aef47f30570c0c6d68ac485c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.8.1

Release files / dom_query-0.0.4-py3-none-any.whl

Download URL dom_query-0.0.4-py3-none-any.whl
Size 13.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
561de867055c0b94b99067ce700c435f97842d9133a11a414c95ed28cada88ee
BLAKE2b-256 checksum
How to use checksums
f149256de5111bc0c0ac7bf0bde1e6ec157829a82649a1fa66ae1ac13b9bb18b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.8.1

Release history Release notifications | RSS feed

This release

0.0.4 This release

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page