JSPM

cheerio-advanced-selectors

2.0.1
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 1736
  • Score
    100M100P100Q122346F
  • License MIT

Add advanced selector support to cheerio

Package Exports

  • cheerio-advanced-selectors

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (cheerio-advanced-selectors) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

cheerio-advanced-selectors

Add support for the following selectors to cheerio:

  • :first
  • :last
  • :eq(index)

More selectors can easily be added: Just open an issue and I'll look into it :)

Build status js-standard-style

This module is inspired by cheerio-eq with the added support for many different selectors.

Supports cheerio version 0.18.0 and above.

Installation

npm install cheerio-advanced-selectors

Usage

Use the .wrap() function to make cheerio-advanced-selectors take care of everything for you:

var cheerio = require('cheerio')
var cheerioAdv = require('cheerio-advanced-selectors')

cheerio = cheerioAdv.wrap(cheerio)

var $ = cheerio.load('<div>foo</div><div>bar</div>')

$('div:first').text() // => 'foo'

Advanced usage

Alternatively use the .find() function to only use cheerio-advanced-selectors for a specific selector:

var cheerio = require('cheerio')
var cheerioAdv = require('cheerio-advanced-selectors')

var $ = cheerio.load('<div><span>foo</span></div><div><span>bar</span></div>')

cheerioAdv.find($, 'div:eq(1)').text() // => 'bar'

If you need to run the same selector on a lot of different HTML documents, you can speed things up by pre-compiling the selector using the .compile() function:

var cheerio = require('cheerio')
var cheerioAdv = require('cheerio-advanced-selectors')

var myH1 = cheerioAdv.compile('div:first span:eq(1) h1')

var html1 = cheerio.load('<div><span><h1>foo1</h1></span><span><h1>bar1</h1></span></div>')
var html2 = cheerio.load('<div><span><h1>foo2</h1></span><span><h1>bar2</h1></span></div>')

myH1(html1).text() // => 'bar1'
myH1(html2).text() // => 'bar2'

What's the problem?

Cheerio sacrifices advanced CSS selector support for speed. This means for instance that the :eq() selector isn't supported. The work-around is normally to use the .eq() function instead:

// this will not work:
$('div:eq(1)');

// use this instead:
$('div').eq(1);

This is a good alternative if you write the CSS selectors from scrach, but what if you are working with selectors that already contain :eq()? Don't fear, cheerio-advanced-selectors is here :)

Solution

The solution to the problem is to automatically parse the selector string at run-time. So if you give cheerio-advanced-selectors a selector like div:eq(1) it will return the following cheerio cursor: $('div').eq(1).

It also works for complex selectors, so that div:eq(1) h2:first span will be converted and interpreted as $('div').eq(1).find('h2').first().find('span').

Supported advanced selectors

This module currently only support a minimal subset of the possible advanced selectors:

  • :first
  • :last
  • :eq(index)

But don't fear :) It's easy to add support for other selectors. Just open an issue or make a pull request.

API

.wrap(cheerio)

Wraps the main cheerio module to overload the standard load function so it knows how to handle the advanced selectors.

Returns the cheerio module.

.find(cheerio, selector [, context [, root]])

Run the selector on the given cheerio object optionally within the given context and optionally on the given root.

The cheerio object is usually called $.

.compile(selector)

Compiles the selector and returns a function which take 3 arguments: fn(cheerio [, context [, root]]):

  • cheerio - a reference to the cheerio object (usually called $)
  • context - the context in which to run the selector (optional)
  • root - the HTML root on which to run the selector (optional)

License

MIT