Skip to content

chriskipp/selectolax

 
 

Repository files navigation

selectolax logo


A fast HTML5 parser with CSS selectors using Modest and Lexbor engines.

Installation

From PyPI using pip:

pip install selectolax

Development version from GitHub:

git clone --recursive https://github.com/rushter/selectolax cd selectolax pip install -r requirements_dev.txt python setup.py install

How to compile selectolax while developing:

make clean make dev

Basic examples

In [1]: from selectolax.parser import HTMLParser ...: ...: html = """  ...: <h1 id="title" data-updated="20201101">Hi there</h1>  ...: <div class="post">Lorem Ipsum is simply dummy text of the printing and typesetting industry. </div>  ...: <div class="post">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</div>  ...: """ ...: tree = HTMLParser(html) In [2]: tree.css_first('h1#title').text() Out[2]: 'Hi there' In [3]: tree.css_first('h1#title').attributes Out[3]: {'id': 'title', 'data-updated': '20201101'} In [4]: [node.text() for node in tree.css('.post')] Out[4]: ['Lorem Ipsum is simply dummy text of the printing and typesetting industry. ', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.']
In [1]: html = "<div><p id=p1><p id=p2><p id=p3><a>link</a><p id=p4><p id=p5>text<p id=p6></div>" ...: selector = "div > :nth-child(2n+1):not(:has(a))" In [2]: for node in HTMLParser(html).css(selector): ...: print(node.attributes, node.text(), node.tag) ...: print(node.parent.tag) ...: print(node.html) ...: {'id': 'p1'} p div <p id="p1"></p> {'id': 'p5'} text p div <p id="p5">text</p>

Available backends

Selectolax supports two backends: Modest and Lexbor. By default, all examples use the Modest backend. Most of the features between backends are almost identical, but there are still some differences.

Currently, the Lexbor backend is in beta and missing some of the features.

To use lexbor, just import the parser and use it in the similar way to the HTMLParser.

In [1]: from selectolax.lexbor import LexborHTMLParser In [2]: html = """  ...: <title>Hi there</title>  ...: <div id="updated">2021-08-15</div>  ...: """ In [3]: parser = LexborHTMLParser(html) In [4]: parser.root.css_first("#updated").text() Out[4]: '2021-08-15'

Simple Benchmark

  • Extract title, links, scripts and a meta tag from main pages of top 754 domains. See examples/benchmark.py for more information.
Package Time
Beautiful Soup (html.parser) 61.02 sec.
lxml 9.09 sec.
html5_parser 16.10 sec.
selectolax (Modest) 2.94 sec.
selectolax (Lexbor) 2.39 sec.

Links

License

About

Python binding to Modest engine (fast HTML5 parser with CSS selectors).

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • Cython 78.4%
  • Python 20.3%
  • Makefile 1.3%