cheerio中文文档
这篇参考手册是对cheerio 官方文档的中文翻译
cheerio是jquery核心功能的一个快速灵活而又简洁的实现,主要是为了用在服务器端需要对DOM进行操作的地方
简介
让你在服务器端和html愉快的玩耍
var cheerio = require('cheerio'),
$ = cheerio.load('<h2 class = "title">Hello world</h2>');
$('h2.title').text('Hello there!');
$('h2').addClass('welcome');
$.html();
//=> <h2 class = "title welcome">Hello there!</h2>
安装
npm install cheerio
特点
熟悉的语法:cheerio实现了jQuery的一个子集,去掉了jQuery中所有与DOM不一致或者是用来填浏览器的坑的东西,重现了jQuery最美妙的API
快到没朋友:cheerio使用了及其简洁而又标准的DOM模型, 因此对文档的转换,操作,渲染都极其的高效。基本的端到端测试显示它的速度至少是JSDOM的8倍
极其灵活:cheerio使用了@FB55编写的非常兼容的htmlparser2,因此它可以解析几乎所有的HTML和XML
关于JSDOM
cheerio产生的原因是出于对JSDOM的失望,主要体现在以下三点:
JSDOM的解析规则太过于严格:JSDOM的解析器无法处理现在许多的流行网站的内容
JSDOM太慢了:解析大的网站甚至可以产生可察觉的延迟
JSDOM太过于重量级:JSDOM的目标是提供与浏览器一样的DOM环境,但是我们往往不需要这样。我们需要的只是一种简单,熟悉的方式来操作我们的HTML
什么时候你应该用JSDOM
cheerio并非万能,当你需要一个浏览器一样的环境时,你最好还是用JSDOM,尤其是你需要进行自动化的功能测试时
API
后面的例子中用到的HTML模板如下:
<ul id="fruits">
<li class="apple">Apple</li>
<li class="orange">Orange</li>
<li class="pear">Pear</li>
</ul>
1. 解析html(load)
首先你需要先加载你的HTML。jQuery会自动完成这一步,因为jQuery操作的DOM是固定的。但是在使用cheerio时我们要手动加载我们的HTML文档
首选的方式如下:
var cheerio = require('cheerio'),
$ = cheerio.load('<ul id = "fruits">...</ul>');
其次,直接把HTML字符串作为上下文也是可以的:
$ = require('cheerio');
$('ul', '<ul id = "fruits">...</ul>');
或者把HTML字符串作为root
$ = require('cheerio');
$('li', 'ul', '<ul id = "fruits">...</ul>');
如果你需要自定义一些解析选项,你可以多传递一个对象给load方法:
$ = cheerio.load('<ul id = "fruits">...</ul>', {
ignoreWhitespace: true,
xmlMode: true
});
更多的解析选项可以参考domhandler和parser-options
2. 选择器(selectors)
cheerio的选择器几乎和jQuery一模一样,所以语法上十分相像
$( selector, [context], [root] )
selector在context的范围内搜索,context的范围又包含在root的范围内。selector和context可以是一个字符串,DOM元素,DOM数组或者cheerio实例。root一般是一个HTML文档字符串
选择器是文档遍历和操作的起点。如同在jQuery中一样,它是选择元素节点最重要的方法,但是在jQuery中选择器建立在CSS选择器标准库上。cheerio的选择器实现了大部分的方法
$('.apple', '#fruits').text()
//=> Apple
$('ul .pear').attr('class')
//=> pear
$('li[class=orange]').html()
//=> <li class = "orange">Orange</li>
3. 属性操作(atrributes)
用来获取和更改属性的方法:
.attr(name, value)
这个方法用来获取和设置属性。获取第一个符合匹配的元素的属性值。如果某个属性值被设置成null,那么该属性会被移除。你也可以把map和function作为参数传递进去,就像在jQuery中一样
$('ul').attr('id')
//=> fruits
$('.apple').attr('id', 'favorite').html()
//=> <li class = "apple" id = "favorite">Apple</li>
更多信息请查看 http://api.jquery.com/attr/
.removeAtrr(name)
移除名为name的属性
$('.pear').removeAttr('class').html()
//=> <li>Pear</li>
.hasClass(className)
检查元素是否含有此类名
$('.pear').hasClass('pear')
//=> true
$('apple').hasClass('fruit')
//=> false
$('li').hasClass('pear')
//=> true
.addClass(className)
添加类名到所有的匹配元素,可以用函数作为参数
$('.pear').addClass('fruit').html()
//=> <li class = "pear fruit">Pear</li>
$('.apple').addClass('fruit red').html()
//=> <li class = "apple fruit red">Apple</li>
.remoteClass([className])
移除一个或者多个(空格分隔)的类名,如果className为空,则所有的类名都会被移除,可以传递函数作为参数
$('.pear').removeClass('pear').html()
//=> <li class = "">Pear</li>
$('.apple').addClass('red').removeClass().html()
//=> <li class = "">Apple</li>
遍历
.find(selector)
在当前元素集合中选择符合选择器规则的元素集合
$('#fruits').find('li').length
//=> 3
.parent()
获取元素集合第一个元素的父元素
$('.pear').parent().attr('id')
//=> fruits
.next()
选择当前元素的下一个兄弟元素
$('.apple').next().hasClass('orange')
//=> true
.prev()
同.next()相反
.siblings()
获取元素集合中第一个元素的所有兄弟元素,不包含它自己
$('.pear').siblings().length
//=> 2
.children( selector )
.each( function(index, element) )
遍历函数返回false即可终止遍
var fruits = [];
$('li').each(function(i, elem) {
fruits[i] = $(this).text();
});
fruits.join(', ');
//=> Apple, Orange, Pear
.map( function(index, element) )
$('li').map(function(i, el) {
// this === el
return $(this).attr('class');
}).get().join(', ');
//=> apple, orange, pear
.filter( selector )
$('li').filter('.orange').attr('class');
//=> orange
.filter( function(index) )
$('li').filter(function(i, el) {
// this === el
return $(this).attr('class') === 'orange';
}).attr('class')
//=> orange
.first()
$('#fruits').children().first().text()
//=> Apple
.last()
$('#fruits').children().last().text()
//=> Pear
.eq( i )
缩小元素集合,可以用负数表示倒数第 i 个元素被保留
$('li').eq(0).text()
//=> Apple
$('li').eq(-1).text()
//=> Pear
操作DOM
操作DOM结构的方法
.append( content, [content, ...] )
.prepend( content, [content, ...] )
.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>
.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>
.remove( [selector] )
$('.pear').remove()
$.html()
//=> <ul id = "fruits">
// <li class = "apple">Apple</li>
// <li class = "orange">Orange</li>
// </ul>
.replaceWith( content )
var 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] )
$('.orange').html()
//=> Orange
$('#fruits').html('<li class = "mango">Mango</li>').html()
//=> <li class="mango">Mango</li>
.text( [textString] )
$('.orange').text()
//=> Orange
$('ul').text()
//=> Apple
// Orange
// Pear
解析和渲染
$.html()
//=> <ul id = "fruits">
// <li class = "apple">Apple</li>
// <li class = "orange">Orange</li>
// <li class = "pear">Pear</li>
// </ul>
输出包含自己在内的HTML(outer HTML)
$.html('.pear')
//=> <li class = "pear">Pear</li>
杂项
.toArray()
$('li').toArray()
//=> [ {...}, {...}, {...} ]
.clone()
var moreFruit = $('#fruits').clone()
常用工具
$.root()
$.root().append('<ul id="vegetables"></ul>').html();
//=> <ul id="fruits">...</ul><ul id="vegetables"></ul>
$.contains( container, contained )
cheerio中文文档的更多相关文章
- Phoenix综述(史上最全Phoenix中文文档)
个人主页:http://www.linbingdong.com 简书地址:http://www.jianshu.com/users/6cb45a00b49c/latest_articles 网上关于P ...
- Chart.js中文文档-雷达图
雷达图或蛛网图(Radar chart) 简介 A radar chart is a way of showing multiple data points and the variation bet ...
- Knockout中文开发指南(完整版API中文文档) 目录索引
a, .tree li > span { padding: 4pt; border-radius: 4px; } .tree li a { color:#46cfb0; text-decorat ...
- ReactNative官方中文文档0.21
整理了一份ReactNative0.21中文文档,提供给需要的reactnative爱好者.ReactNative0.21中文文档.chm 百度盘下载:ReactNative0.21中文文档 来源: ...
- java中文文档官方下载
一直在寻找它,今天无意之间终于发现它了! http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/overview-summa ...
- Spring中文文档
前一段时间翻译了Jetty的一部分文档,感觉对阅读英文没有大的提高(*^-^*),毕竟Jetty的受众面还是比较小的,而且翻译过程中发现Jetty的文档写的不是很好,所以呢翻译的兴趣慢慢就不大了,只能 ...
- jQuery 3.1 API中文文档
jQuery 3.1 API中文文档 一.核心 1.1 核心函数 jQuery([selector,[context]]) 接收一个包含 CSS 选择器的字符串,然后用这个字符串去匹配一组元素. jQ ...
- jQuery EasyUI API 中文文档 - ComboGrid 组合表格
jQuery EasyUI API 中文文档 - ComboGrid 组合表格,需要的朋友可以参考下. 扩展自 $.fn.combo.defaults 和 $.fn.datagrid.defaults ...
- jQuery EasyUI API 中文文档 - ValidateBox验证框
jQuery EasyUI API 中文文档 - ValidateBox验证框,使用jQuery EasyUI的朋友可以参考下. 用 $.fn.validatebox.defaults 重写了 d ...
- Weex中文文档
这里整理当前已译出的Weex中文文档,如需查阅完整Weex文档,请访问http://alibaba.github.io/weex/doc/ . 同时也欢迎大家参与Weex中文文档翻译 [Guide] ...
随机推荐
- snapshot备份
snapshot C: "h:\esd\$date_$hour_$minute_C.sna" -L0 -R -G snapshot64.exe C: "H:\ESD\$d ...
- 「postOI」Lost Array
题意 有一个序列 \(A=\{a_1, a_2, ..., a_n\}\),按如下方式构造一个 \((n + 1) \times (n + 1)\) 的矩阵 \(B\): \(B_{i0}=0\)(\ ...
- Java包机制 与Javados 命令
package: 定义包 import : 导入包 com.wang.test.* :点* 是导入当前包下的所有类 @author :注释作者名 @version :注释版本号 @since ...
- 5_Java对象
面向对象编程 对于描述复杂的事物,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统.但是,具体到微观操作,仍然需要面向过程的思路去处理. 面向对象编程(Object-Ori ...
- 【Java学习Day07】标识符
标识符 Java使用的组成部分的需要名字.类名.变量名以及方法名都被称为标识符 标识符的注意点 所有的标识符都应该以字母(A-Z或者a-z),美元符($).或者下划线(_)开始 首字符之后可以是字母( ...
- 数据仓库服务 GaussDB(DWS)
官网:总体介绍 https://support.huaweicloud.com/dws/index.html 部分源码解读 https://my.oschina.net/gaussdb?tab=new ...
- MQTT QoS 0, 1, 2 介绍
什么是 QoS 很多时候,使用 MQTT 协议的设备都运行在网络受限的环境下,而只依靠底层的 TCP 传输协议,并不能完全保证消息的可靠到达.因此,MQTT 提供了 QoS 机制,其核心是设计了多种消 ...
- HOLIscapes使用条款与免责协议
HOLIscapes(以下简称"我们")在此特别提醒您务必认真阅读.充分理解本<使用条款与免责协议>(以下简称"本协议")中各条款并选择是否接受本协 ...
- C++ 用同一个raw pointer传入shared_ptr构造函数生成两个智能指针有什么问题?
Effective Modern C++ Item 19: use std::shared_ptr for shared-ownership resource Now, the constructor ...
- NDK 减少 so 库体积方法总结
. 使用 strip 使用 NDK toolchain 可以把调试的 C++ 符号表(Symbol Table)中数据删除,我们一般我们打成 APK 会自动帮我们做这个工作,当然也可以手动设置: 手动 ...