cheerio

Fast, flexible & lean implementation of core jQuery designed specifically for the server.
Travis CI Coverage Join the chat at https://gitter.im/cheeriojs/cheerio OpenCollective backers OpenCollective sponsors


const cheerio = require('cheerio')
const $ = cheerio.load('<h2 class="title">Hello world</h2>')

$('h2.title').text('Hello there!')
$('h2').addClass('welcome')

$.html()
//=> <h2 class="title welcome">Hello there!</h2>

Note

我们目前正在master分支上开发cheerio 1.0.0版本. 可以在此处找到最新发布的版本0.22.0的源代码.

Installation

npm install cheerio

Features

❤熟悉的语法: Cheerio实现了核心jQuery的子集. Cheerio从jQuery库中消除了所有DOM不一致和浏览器残骸,从而揭示了其真正华丽的API.

ϟ快速发展: Cheerio使用非常简单,一致的DOM模型工作. 结果,解析,操作和渲染都非常高效.

flexible 极其 灵活: Cheerio将@ FB55宽容的htmlparser2包裹起来. Cheerio可以解析几乎任何HTML或XML文档.

Cheerio is not a web browser

Cheerio解析标记并提供用于遍历/操纵结果数据结构的API. 它不像Web浏览器那样解释结果. 具体来说,它不会产生视觉效果, 不会应用CSS,加载外部资源或执行JavaScript. 如果您的用例需要任何此功能,则应考虑使用PhantomJSJSm之类的项目.

Sponsors

贵公司是否在生产中使用Cheerio? 请考虑赞助这个项目 . 您的帮助将使维护人员将更多的时间和资源用于其开发和支持.

Backers

成为支持者,以显示您对Cheerio的支持,并帮助我们维护和改进此开源项目.

API

Table of contents

Selectors - [$( selector, [context], [root] )](#-selector-context-root-)
属性 -[.attr(name,value)](#attr-name-value-)-[.prop(name,value)](#prop-name-value-)-[.data(name,value)](#数据名称值-)-[.val([值])](#val-值-)-[.removeAttr(名称)](#removeattr-name-)-[.hasClass(className)](#hasclass -classname-)-[.addClass(className)](#addclass-classname-)-[.removeClass([className])](#removeclass-classname-)-[.toggleClass(className,[switch])](# toggleclass-classname-switch-)-[.is(选择器)](#is-选择器-)-[.is(元素)](#is-元素-)-[.is(选择器)](#is-选择-)-[.is(function(index))](#is-functionindex-)
形式 -[.serialize()](#serialize)-[.serializeArray()](#serializearray)
遍历 -[.find(选择器)](#findselector)-[.find(选择)](#findselection)-[.find(节点)](#findnode)-[.parent([选择器])](#parentselector) -[.parents([selector])](#parentsselector)-[.parentsUntil([selector] [,filter])](#parentsuntilselectorfilter)-[.closest(selector)](#closestselector)-[.next([选择器]]](#nextselector)-[.nextAll([选择器])](#nextallselector)-[.nextUntil([选择器],[过滤器])] [#nextuntilselector-filter)-[.prev([选择器] )](#prevselector)-[.prevAll([selector])](#prevallselector)-[.prevUntil([selector],[filter])] [#prevuntilselector-filter)-[.slice(start,[end] )](#slice-start-end-)-[.siblings([selector])](#siblingsselector)-[.children([selector])](#childrenselector)-[.contents()](#contents) -[.each(function(index,element))](#each-functionindex-element-)-[.map(function(index,element))](#map-functionindex-element-)-[.filter(选择器)
.filter(选择)
.filter(元素)
.filter(function(index(element,element))](#filter-selector --- filter-selection --- filter-element --- filter-functionindex-element-)-[.not(selector)
.not(选择)
.not(element)
.not(function(index,elem))](#not-selector --- not-selection --- not-element --- not-functionindex-elem-)-[.has(selector)
.has(element)](#has-selector --- has-element-)-[.first()](#first)-[.last()](#last)-[.eq(i)]( #eq-i-)-[.get([i])](#get-i-)-[.index()](#index)-[.index(选择器)](#index-selector-)- [.index(nodeOrSelection)](#index-nodeorselection-)-[.end()](#end)-[.add(选择器[,上下文])](#add-selector--context-)-[. add(元素)](#add-element-)-[.add(元素)](#add-elements-)-[.add(html)](#add-html-)-[.add(selection)] (#add-selection-)-[.addBack([filter])](#addback-filter-)
操纵 -[.append(content,[content,...])](#append-content-content--)-[.appendTo(target)](#appendto-target-)-[.prepend(content,[content ,...])](#prepend-content-content--)-[.prependTo(target)](#prependto-target-)-[.after(content,[content,...])](# after-content-content--)-[.insertAfter(target)](#insertafter-target-)-[.before(content,[content,...])](#before-content-content--)- [.insertBefore(target)](#insertbefore-target-)-[.remove([selector])](#remove-selector-)-[.replaceWith(content)](#replacewith-content-)-[.empty ()](#empty)-[.html([htmlString])](#html-htmlstring-)-[.text([textString])](#text-textstring-)-[.wrap(content)]( #wrap-content-)-[.css([propertName])
.css([propertyNames])
.css([propertyName],[value])
.css([propertName],[function])
.css([properties])](#css-propername --- css-propertynames --- css-propertyname-value --- css-propernamename-function --- css-properties-)

Markup example we’ll be using:

<ul id="fruits">
  <li class="apple">Apple</li>
  <li class="orange">Orange</li>
  <li class="pear">Pear</li>
</ul>

这是我们将在所有API示例中使用的HTML标记.

Loading

首先,您需要加载HTML. jQuery的这一步骤是隐式的,因为jQuery在一个内置的DOM上运行. 使用Cheerio,我们需要传递HTML文档.

这是首选方法:

const cheerio = require('cheerio');
const $ = cheerio.load('<ul id="fruits">...</ul>');

(可选)您还可以通过传递字符串作为上下文来加载HTML:

const $ = require('cheerio');
$('ul', '<ul id="fruits">...</ul>');

或作为根:

const $ = require('cheerio');
$('li', 'ul', '<ul id="fruits">...</ul>');

如果需要修改任何默认解析选项,还可以将一个额外的对象传递给.load()

const $ = cheerio.load('<ul id="fruits">...</ul>', {
    normalizeWhitespace: true,
    xmlMode: true
});

这些解析选项直接来自htmlparser2 ,因此可以在htmlparser2中使用的任何选项在htmlparser2也有效. 默认选项是:

{
    withDomLvl1: true,
    normalizeWhitespace: false,
    xmlMode: false,
    decodeEntities: true
}

有关选项及其效果的完整列表,请参见thishtmlparser2的options .

Selectors

Cheerio的选择器实现与jQuery的选择器实现几乎相同,因此API非常相似.

$( selector, [context], [root] )

selectorcontext范围内搜索,后者在root范围内搜索. selectorcontext可以是字符串表达式,DOM元素,DOM元素数组或cheerio对象. root通常是HTML文档字符串.

此选择器方法是遍历和操作文档的起点. 与jQuery一样,它是选择文档中元素的主要方法,但与jQuery不同,它建立在CSSSelect库的顶部,该库实现了大多数Sizzle选择器.

$('.apple', '#fruits').text()
//=> Apple

$('ul .pear').attr('class')
//=> pear

$('li[class=orange]').html()
//=> Orange
XML Namespaces

您可以使用XML命名空间选择,但由于CSS规范 ,冒号( :需要转义的选择才有效).

$('[xml\\:id="main"');

Attributes

获取和修改属性的方法.

.attr( name, value )

获取和设置属性的方法. 仅获取匹配集中第一个元素的属性值. 如果将属性的值设置为null ,则删除该属性. 您还可以传递map和类似jQuery的function .

$('ul').attr('id')
//=> fruits

$('.apple').attr('id', 'favorite').html()
//=> <li class="apple" id="favorite">Apple</li>

有关更多信息,请参见http://api.jquery.com/attr/

.prop( name, value )

获取和设置属性的方法. 仅获取匹配集中第一个元素的属性值.

$('input[type="checkbox"]').prop('checked')
//=> false

$('input[type="checkbox"]').prop('checked', true).val()
//=> ok

有关更多信息,请参见http://api.jquery.com/prop/

.data( name, value )

获取和设置数据属性的方法. 仅获取或设置匹配集中第一个元素的数据属性值.

$('<div data-apple-color="red"></div>').data()
//=> { appleColor: 'red' }

$('<div data-apple-color="red"></div>').data('apple-color')
//=> 'red'

const apple = $('.apple').data('kind', 'mac')
apple.data('kind')
//=> 'mac'

有关更多信息,请参见http://api.jquery.com/data/

.val( [value] )

获取和设置输入,选择和文本区域的值的方法. 注意:支持mapfunction尚未添加.

$('input[type="text"]').val()
//=> input_text

$('input[type="text"]').val('test').html()
//=> <input type="text" value="test"/>

.removeAttr( name )

name删除属性的方法.

$('.pear').removeAttr('class').html()
//=> <li>Pear</li>

.hasClass( className )

检查是否有任何匹配的元素具有给定的className .

$('.pear').hasClass('pear')
//=> true

$('apple').hasClass('fruit')
//=> false

$('li').hasClass('pear')
//=> true

.addClass( className )

将类添加到所有匹配的元素. 还接受jQuery之类的function .

$('.pear').addClass('fruit').html()
//=> <li class="pear fruit">Pear</li>

$('.apple').addClass('fruit red').html()
//=> <li class="apple fruit red">Apple</li>

有关更多信息,请参见http://api.jquery.com/addClass/.

.removeClass( [className] )

从所选元素中删除一个或多个以空格分隔的类. 如果未定义className ,则将删除所有类. 还接受jQuery之类的function .

$('.pear').removeClass('pear').html()
//=> <li class="">Pear</li>

$('.apple').addClass('red').removeClass().html()
//=> <li class="">Apple</li>

有关更多信息,请参见http://api.jquery.com/removeClass/.

.toggleClass( className, [switch] )

根据类的存在或switch参数的值,从匹配的元素中添加或删除类. 还接受jQuery之类的function .

$('.apple.green').toggleClass('fruit green red').html()
//=> <li class="apple fruit red">Apple</li>

$('.apple.green').toggleClass('fruit green red', true).html()
//=> <li class="apple green fruit red">Apple</li>

有关更多信息,请参见http://api.jquery.com/toggleClass/.

.is( selector )

.is( element )

.is( selection )

.is( function(index) )

检查当前元素列表,如果任何元素与选择器匹配,则返回true . 如果使用元素或Cheerio选择,则在任何元素匹配时返回true . 如果使用谓词函数,则该函数在所选元素的上下文中执行,因此this引用当前元素.

Forms

.serialize()

将一组表单元素编码为URL查询字符串.

$('<form><input name="foo" value="bar" checked /><input name="foo" value="qux" checked /></form>').serialize()
//=> foo=bar&foo=qux

.serializeArray()

将一组表单元素编码为名称和值的数组.

$('<form><input name="foo" value="bar" /></form>').serializeArray()
//=> [ { name: 'foo', value: 'bar' } ]

Traversing

.find(selector)

.find(selection)

.find(node)

获取当前匹配元素集中每个元素的后代,并通过选择器,jQuery对象或元素进行过滤.

$('#fruits').find('li').length
//=> 3
$('#fruits').find($('.apple')).length
//=> 1

.parent([selector])

获取当前匹配元素集中每个元素的父元素,可以选择使用选择器进行过滤.

$('.pear').parent().attr('id')
//=> fruits

.parents([selector])

获取一组父对象,这些父对象由当前匹配元素集中每个元素的selector过滤.

$('.orange').parents().length
// => 2
$('.orange').parents('#fruits').length
// => 1

.parentsUntil([selector][,filter])

获取当前匹配元素集中每个元素的祖先,直到但不包括选择器,DOM节点或cheerio对象匹配的元素.

$('.orange').parentsUntil('#food').length
// => 1

.closest(selector)

对于集合中的每个元素,通过测试元素本身并在DOM树中遍历其祖先,获得与选择器匹配的第一个元素.

$('.orange').closest()
// => []
$('.orange').closest('.apple')
// => []
$('.orange').closest('li')
// => [<li class="orange">Orange</li>]
$('.orange').closest('#fruits')
// => [<ul id="fruits"> ... </ul>]

.next([selector])

获取第一个选定元素的下一个同级,可选地由选择器过滤.

$('.apple').next().hasClass('orange')
//=> true

.nextAll([selector])

获取第一个选定元素的以下所有同级元素,可以选择由选择器过滤.

$('.apple').nextAll()
//=> [<li class="orange">Orange</li>, <li class="pear">Pear</li>]
$('.apple').nextAll('.orange')
//=> [<li class="orange">Orange</li>]

.nextUntil([selector], [filter])

获取以下所有同级,直到但不包括与选择器匹配的元素,并可选地由另一个选择器过滤.

$('.apple').nextUntil('.pear')
//=> [<li class="orange">Orange</li>]

.prev([selector])

获取第一个选定元素的先前同级(可选地由选择器过滤).

$('.orange').prev().hasClass('apple')
//=> true

.prevAll([selector])

获取第一个选定元素的所有先前同级,可选地由选择器过滤.

$('.pear').prevAll()
//=> [<li class="orange">Orange</li>, <li class="apple">Apple</li>]
$('.pear').prevAll('.orange')
//=> [<li class="orange">Orange</li>]

.prevUntil([selector], [filter])

获取直到但不包括选择器匹配的元素(可选地由另一个选择器过滤)的所有先前的同级对象.

$('.pear').prevUntil('.apple')
//=> [<li class="orange">Orange</li>]

.slice( start, [end] )

获取与指定范围匹配的元素

$('li').slice(1).eq(0).text()
//=> 'Orange'

$('li').slice(1, 2).length
//=> 1

.siblings([selector])

获取第一个选定元素的兄弟姐妹,不包括其自身.

$('.pear').siblings().length
//=> 2

$('.pear').siblings('.orange').length
//=> 1

.children([selector])

获取第一个选定元素的子级.

$('#fruits').children().length
//=> 3

$('#fruits').children('.pear').text()
//=> Pear

.contents()

获取匹配的元素集中每个元素的子元素,包括文本和注释节点.

$('#fruits').contents().length
//=> 3

.each( function(index, element) )

遍历cheerio对象,为每个匹配的元素执行一个函数. 触发回调时,将在DOM元素的上下文中触发函数,因此this引用当前元素,等效于function parameter element . 要及早退出each循环,请返回false .

const fruits = [];

$('li').each(function(i, elem) {
  fruits[i] = $(this).text();
});

fruits.join(', ');
//=> Apple, Orange, Pear

.map( function(index, element) )

通过函数传递当前匹配集中的每个元素,产生一个包含返回值的新Cheerio对象. 该函数可以返回要插入到结果集中的单个数据项或数据项数组. 如果返回数组,则将数组内的元素插入到集合中. 如果函数返回null或undefined,则不会插入任何元素.

$('li').map(function(i, el) {
  // this === el
  return $(this).text();
}).get().join(' ');
//=> "apple orange pear"

.filter( selector )
.filter( selection )
.filter( element )
.filter( function(index, element) )

遍历cheerio对象,将选择器元素的集合减少到与选择器匹配或通过功能测试的元素. 指定Cheerio选择时,仅返回该选择中包含的元素. 指定元素后,仅返回该元素(如果它包含在原始选择中). 如果使用函数方法,则该函数在所选元素的上下文中执行,因此this是指当前元素.

Selector:

$('li').filter('.orange').attr('class');
//=> orange

Function:

$('li').filter(function(i, el) {
  // this === el
  return $(this).attr('class') === 'orange';
}).attr('class')
//=> orange

.not( selector )
.not( selection )
.not( element )
.not( function(index, elem) )

从匹配的元素集中删除元素. 给定一个表示一组DOM元素的jQuery对象, .not()方法从匹配元素的子集构造一个新的jQuery对象. 提供的选择器已针对每个元素进行了测试; 与选择器不匹配的元素将包含在结果中. .not()方法可以像.filter()一样将函数作为参数. 函数返回true的元素从过滤后的集合中排除; 所有其他元素都包括在内.

Selector:

$('li').not('.apple').length;
//=> 2

Function:

$('li').not(function(i, el) {
  // this === el
  return $(this).attr('class') === 'orange';
}).length;
//=> 2

.has( selector )
.has( element )

将匹配的元素集过滤为仅具有给定DOM元素作为后代或具有与给定选择器匹配的后代的元素. 等效于.filter(':has(selector)') .

Selector:

$('ul').has('.pear').attr('id');
//=> fruits

Element:

$('ul').has($('.pear')[0]).attr('id');
//=> fruits

.first()

将选择cheerio对象的第一个元素

$('#fruits').children().first().text()
//=> Apple

.last()

将选择cheerio对象的最后一个元素

$('#fruits').children().last().text()
//=> Pear

.eq( i )

将匹配的元素集减少到指定索引处的元素. 使用.eq(-i)从最后选择的元素开始倒数.

$('li').eq(0).text()
//=> Apple

$('li').eq(-1).text()
//=> Pear

.get( [i] )

检索与Cheerio对象匹配的DOM元素. 如果指定了索引,则检索与Cheerio对象匹配的元素之一:

$('li').get(0).tagName
//=> li

如果未指定索引,则检索与Cheerio对象匹配的所有元素:

$('li').get().length
//=> 3

.index()

.index( selector )

.index( nodeOrSelection )

从匹配的元素中搜索给定的元素.

$('.pear').index()
//=> 2
$('.orange').index('li')
//=> 1
$('.apple').index($('#fruit, li'))
//=> 1

.end()

结束当前链中的最新过滤操作,并将匹配的元素集返回到其先前状态.

$('li').eq(0).end().length
//=> 3

.add( selector [, context] )

.add( element )

.add( elements )

.add( html )

.add( selection )

Add elements to the set of matched elements.

$('.apple').add('.orange').length
//=> 2

.addBack( [filter] )

将堆栈上的前一组元素添加到当前集中,可以选择通过选择器进行过滤.

$('li').eq(0).addBack('.orange').length
//=> 2

Manipulation

修改DOM结构的方法.

.append( content, [content, …] )

插入内容作为每个选定元素的最后一个子元素.

$('ul').append('<li class="plum">Plum</li>')
$.html()
//=>  <ul id="fruits">
//      <li class="apple">Apple</li>
//      <li class="orange">Orange</li>
//      <li class="pear">Pear</li>
//      <li class="plum">Plum</li>
//    </ul>

.appendTo( target )

将匹配元素集中的每个元素插入目标的末尾.

$('<li class="plum">Plum</li>').appendTo('#fruits')
$.html()
//=>  <ul id="fruits">
//      <li class="apple">Apple</li>
//      <li class="orange">Orange</li>
//      <li class="pear">Pear</li>
//      <li class="plum">Plum</li>
//    </ul>

.prepend( content, [content, …] )

将内容作为每个选定元素的第一个子项插入.

$('ul').prepend('<li class="plum">Plum</li>')
$.html()
//=>  <ul id="fruits">
//      <li class="plum">Plum</li>
//      <li class="apple">Apple</li>
//      <li class="orange">Orange</li>
//      <li class="pear">Pear</li>
//    </ul>

.prependTo( target )

将匹配元素集中的每个元素插入目标的开头.

$('<li class="plum">Plum</li>').prependTo('#fruits')
$.html()
//=>  <ul id="fruits">
//      <li class="plum">Plum</li>
//      <li class="apple">Apple</li>
//      <li class="orange">Orange</li>
//      <li class="pear">Pear</li>
//    </ul>

.after( content, [content, …] )

在匹配的元素集中的每个元素旁边插入内容.

$('.apple').after('<li class="plum">Plum</li>')
$.html()
//=>  <ul id="fruits">
//      <li class="apple">Apple</li>
//      <li class="plum">Plum</li>
//      <li class="orange">Orange</li>
//      <li class="pear">Pear</li>
//    </ul>

.insertAfter( target )

在目标后面插入匹配元素集中的每个元素.

$('<li class="plum">Plum</li>').insertAfter('.apple')
$.html()
//=>  <ul id="fruits">
//      <li class="apple">Apple</li>
//      <li class="plum">Plum</li>
//      <li class="orange">Orange</li>
//      <li class="pear">Pear</li>
//    </ul>

.before( content, [content, …] )

在匹配的元素集中的每个元素之前插入内容.

$('.apple').before('<li class="plum">Plum</li>')
$.html()
//=>  <ul id="fruits">
//      <li class="plum">Plum</li>
//      <li class="apple">Apple</li>
//      <li class="orange">Orange</li>
//      <li class="pear">Pear</li>
//    </ul>

.insertBefore( target )

将匹配元素集中的每个元素插入目标之前.

$('<li class="plum">Plum</li>').insertBefore('.apple')
$.html()
//=>  <ul id="fruits">
//      <li class="plum">Plum</li>
//      <li class="apple">Apple</li>
//      <li class="orange">Orange</li>
//      <li class="pear">Pear</li>
//    </ul>

.remove( [selector] )

从DOM及其所有子级中删除匹配的元素集. selector过滤要删除的匹配元素集.

$('.pear').remove()
$.html()
//=>  <ul id="fruits">
//      <li class="apple">Apple</li>
//      <li class="orange">Orange</li>
//    </ul>

.replaceWith( content )

content替换匹配的元素.

const plum = $('<li class="plum">Plum</li>')
$('.pear').replaceWith(plum)
$.html()
//=> <ul id="fruits">
//     <li class="apple">Apple</li>
//     <li class="orange">Orange</li>
//     <li class="plum">Plum</li>
//   </ul>

.empty()

空元素,删除其所有子元素.

$('ul').empty()
$.html()
//=>  <ul id="fruits"></ul>

.html( [htmlString] )

从第一个选定的元素获取html内容字符串. 如果指定了htmlString ,则每个选定元素的内容都将被新内容替换.

$('.orange').html()
//=> Orange

$('#fruits').html('<li class="mango">Mango</li>').html()
//=> <li class="mango">Mango</li>

.text( [textString] )

获取匹配的元素集中每个元素的组合文本内容,包括它们的后代. 如果指定了textString ,则每个选定元素的内容将被新的文本内容替换.

$('.orange').text()
//=> Orange

$('ul').text()
//=>  Apple
//    Orange
//    Pear

.wrap( content )

.wrap()函数可以采用任何可以传递给$()工厂函数的字符串或对象来指定DOM结构. 该结构可以嵌套在几层深处,但应仅包含一个最里面的元素. 此结构的副本将包装在匹配元素集中的每个元素周围. 此方法返回原始元素集以进行链接.

const redFruit = $('<div class="red-fruit"></div>')
$('.apple').wrap(redFruit)

//=> <ul id="fruits">
//     <div class="red-fruit">
//      <li class="apple">Apple</li>
//     </div>
//     <li class="orange">Orange</li>
//     <li class="plum">Plum</li>
//   </ul>

const healthy = $('<div class="healthy"></div>')
$('li').wrap(healthy)

//=> <ul id="fruits">
//     <div class="healthy">
//       <li class="apple">Apple</li>
//     </div>
//     <div class="healthy">
//       <li class="orange">Orange</li>
//     </div>
//     <div class="healthy">
//        <li class="plum">Plum</li>
//     </div>
//   </ul>

.css( [propertyName] )
.css( [ propertyNames] )
.css( [propertyName], [value] )
.css( [propertyName], [function] )
.css( [properties] )

获取匹配元素集中第一个元素的style属性值,或者为每个匹配元素设置一个或多个CSS属性.

Rendering

准备呈现文档时,可以使用html实用程序功能:

$.html()
//=>  <ul id="fruits">
//      <li class="apple">Apple</li>
//      <li class="orange">Orange</li>
//      <li class="pear">Pear</li>
//    </ul>

如果要返回outerHTML,则可以使用$.html(selector)

$.html('.pear')
//=> <li class="pear">Pear</li>

默认情况下, html将使某些标签保持打开状态. 有时您可能想渲染一个有效的XML文档. 例如,您可以解析以下XML代码段:

const $ = cheerio.load('<media:thumbnail url="http://www.foo.com/keyframe.jpg" width="75" height="50" time="12:05:01.123"/>');

……后来想渲染为XML. 为此,您可以使用" xml"实用程序功能:

$.xml()
//=>  <media:thumbnail url="http://www.foo.com/keyframe.jpg" width="75" height="50" time="12:05:01.123"/>

您还可以使用text静态方法呈现Cheerio对象的文本内容:

const $ = cheerio.load('This is <em>content</em>.')
$.text()
//=> This is content.

可以在Cheerio模块本身上调用该方法-确保传递节点集合!

const $ = cheerio.load('<div>This is <em>content</em>.</div>')
cheerio.text($('div'))
//=> This is content.

Miscellaneous

DOM元素方法不适合其他任何地方

.toArray()

以数组的形式检索jQuery集中包含的所有DOM元素.

$('li').toArray()
//=> [ {...}, {...}, {...} ]

.clone()

克隆cheerio对象.

const moreFruit = $('#fruits').clone()

Utilities

$.root

有时您需要使用顶级根元素. 要查询它,可以使用$.root() .

$.root().append('<ul id="vegetables"></ul>').html();
//=> <ul id="fruits">...</ul><ul id="vegetables"></ul>

$.contains( container, contained )

检查以查看是否contained DOM元素是的后代container DOM元素.

$.parseHTML( data [, context ] [, keepScripts ] )

将字符串解析为DOM节点数组. context参数对于Cheerio没有意义,但是为了实现API兼容性而保留了该参数.

$.load( html[, options ] )

载入HTML. (有关更多信息,请参见标题为"加载"的上一节.)

Plugins

加载文档后,可以使用自定义插件方法扩展原型或等效的fn属性:

const $ = cheerio.load('<html><body>Hello, <b>world</b>!</body></html>');
$.prototype.logHtml = function() {
  console.log(this.html());
};

$('body').logHtml(); // logs "Hello, <b>world</b>!" to the console

The “DOM Node” object

Cheerio集合由与基于浏览器的DOM节点有些相似的对象组成 . 您可以期望它们定义以下属性:

Screencasts

http://vimeo.com/31950192

该视频教程是Nettut的"如何使用Node.js和jQuery擦除网页"的后续文章,使用的是cheerio而不是JSDOM + jQuery. 该视频显示了使用cheerio的过程非常简单,并且cheerio的速度比JSDOM + jQuery快得多.

Contributors

这些是使欢呼成为可能的一些贡献者:

project  : cheerio
 repo age : 2 years, 6 months
 active   : 285 days
 commits  : 762
 files    : 36
 authors  :
   293  Matt Mueller            38.5%
   133  Matthew Mueller         17.5%
    92  Mike Pennisi            12.1%
    54  David Chambers          7.1%
    30  kpdecker                3.9%
    19  Felix Böhm             2.5%
    17  fb55                    2.2%
    15  Siddharth Mahendraker   2.0%
    11  Adam Bretz              1.4%
     8  Nazar Leush             1.0%
     7  ironchefpython          0.9%
     6  Jarno Leppänen         0.8%
     5  Ben Sheldon             0.7%
     5  Jos Shepherd            0.7%
     5  Ryan Schmukler          0.7%
     5  Steven Vachon           0.7%
     4  Maciej Adwent           0.5%
     4  Amir Abu Shareb         0.5%
     3  jeremy.dentel@brandingbrand.com 0.4%
     3  Andi Neck               0.4%
     2  steve                   0.3%
     2  alexbardas              0.3%
     2  finspin                 0.3%
     2  Ali Farhadi             0.3%
     2  Chris Khoo              0.3%
     2  Rob Ashton              0.3%
     2  Thomas Heymann          0.3%
     2  Jaro Spisak             0.3%
     2  Dan Dascalescu          0.3%
     2  Torstein Thune          0.3%
     2  Wayne Larsen            0.3%
     1  Timm Preetz             0.1%
     1  Xavi                    0.1%
     1  Alex Shaindlin          0.1%
     1  mattym                  0.1%
     1  Felix Böhm            0.1%
     1  Farid Neshat            0.1%
     1  Dmitry Mazuro           0.1%
     1  Jeremy Hubble           0.1%
     1  nevermind               0.1%
     1  Manuel Alabor           0.1%
     1  Matt Liegey             0.1%
     1  Chris O'Hara            0.1%
     1  Michael Holroyd         0.1%
     1  Michiel De Mey          0.1%
     1  Ben Atkin               0.1%
     1  Rich Trott              0.1%
     1  Rob "Hurricane" Ashton  0.1%
     1  Robin Gloster           0.1%
     1  Simon Boudrias          0.1%
     1  Sindre Sorhus           0.1%
     1  xiaohwan                0.1%

Cheerio in the real world

您在生产中使用cheerio吗? 将其添加到Wiki

Testing

要运行测试套件,请下载存储库,然后在cheerio目录中运行:

make setup
make test

这将下载开发包并运行测试套件.

Special Thanks

该库位于一些不可思议的开发人员的肩膀上. 特别感谢:

•@ FB55(用于node-htmlparser2和CSSSelect): Felix具有编写快速解析引擎的技巧. 他完全node-htmlparser完全重写了node-htmlparsernode-htmlparsernode-htmlparsernode-soupselect ,使它们都更快,更灵活. 没有他的基础工作,Cheerio是不可能的

•jQuery的@jQuery团队:核心API是同类产品中最好的,尽管处理了所有浏览器不一致的问题,但代码库却非常干净且易于遵循. cheerio的许多实现和文档都来自jQuery. 多谢你们.

•@visionmedia:该库的样式,结构和开放源代码"性"来自研究TJ的样式并使用了许多他的库. 这个花花公子始终如一地抽出高质量的库,并且一直乐于帮助或回答问题. 你摇滚TJ.

License

MIT