cheerio中文文檔

這篇參考手冊是對cheerio 官方文檔 的中文翻譯

cheerio是jquery核心功能的一個快速靈活而又簡潔的實現(xiàn)雷蹂,主要是為了用在服務器端需要對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實現(xiàn)了jQuery的一個子集掀淘,去掉了jQuery中所有與DOM不一致或者是用來填瀏覽器的坑的東西昌犹,重現(xiàn)了jQuery最美妙的API

  • 快到?jīng)]朋友:cheerio使用了及其簡潔而又標準的DOM模型, 因此對文檔的轉(zhuǎn)換面褐,操作亿蒸,渲染都極其的高效∧掷玻基本的端到端測試顯示它的速度至少是JSDOM的8倍

  • 極其靈活:cheerio使用了@FB55編寫的非常兼容的htmlparser2,因此它可以解析幾乎所有的HTML和XML

關于JSDOM

cheerio產(chǎn)生的原因是出于對JSDOM的失望辕坝,主要體現(xiàn)在以下三點:

  • JSDOM的解析規(guī)則太過于嚴格:JSDOM的解析器無法處理現(xiàn)在許多的流行網(wǎng)站的內(nèi)容

  • JSDOM太慢了:解析大的網(wǎng)站甚至可以產(chǎn)生可察覺的延遲

  • JSDOM太過于重量級:JSDOM的目標是提供與瀏覽器一樣的DOM環(huán)境窍奋,但是我們往往不需要這樣。我們需要的只是一種簡單酱畅,熟悉的方式來操作我們的HTML

什么時候你應該用JSDOM

cheerio并非萬能琳袄,當你需要一個瀏覽器一樣的環(huán)境時,你最好還是用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
});

更多的解析選項可以參考domhandlerparser-options

2. 選擇器(selectors)

cheerio的選擇器幾乎和jQuery一模一樣樊诺,所以語法上十分相像

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

selectorcontext的范圍內(nèi)搜索仗考,context的范圍又包含在root的范圍內(nèi)。selectorcontext可以是一個字符串啄骇,DOM元素痴鳄,DOM數(shù)組或者cheerio實例。root一般是一個HTML文檔字符串

選擇器是文檔遍歷和操作的起點缸夹。如同在jQuery中一樣痪寻,它是選擇元素節(jié)點最重要的方法螺句,但是在jQuery中選擇器建立在CSS選擇器標準庫上。cheerio的選擇器實現(xiàn)了大部分的方法

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

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

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

3. 屬性操作(atrributes)

用來獲取和更改屬性的方法:

.attr(name, value)

這個方法用來獲取和設置屬性橡类。獲取第一個符合匹配的元素的屬性值蛇尚。如果某個屬性值被設置成null,那么該屬性會被移除顾画。你也可以把mapfunction作為參數(shù)傳遞進去取劫,就像在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)

添加類名到所有的匹配元素,可以用函數(shù)作為參數(shù)

$('.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/

.remoteClass([className])

移除一個或者多個(空格分隔)的類名研侣,如果className為空谱邪,則所有的類名都會被移除,可以傳遞函數(shù)作為參數(shù)

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

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

參見 http://api.jquery.com/removeClass/

遍歷

.find(selector)

在當前元素集合中選擇符合選擇器規(guī)則的元素集合

$('#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) )

遍歷函數(shù)返回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 )

縮小元素集合惦银,可以用負數(shù)表示倒數(shù)第 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>

輸出包含自己在內(nèi)的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 )

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市末誓,隨后出現(xiàn)的幾起案子扯俱,更是在濱河造成了極大的恐慌,老刑警劉巖喇澡,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迅栅,死亡現(xiàn)場離奇詭異,居然都是意外死亡晴玖,警方通過查閱死者的電腦和手機读存,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窜醉,“玉大人宪萄,你說我怎么就攤上這事≌ザ瑁” “怎么了拜英?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長琅催。 經(jīng)常有香客問我居凶,道長,這世上最難降的妖魔是什么藤抡? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任侠碧,我火速辦了婚禮,結果婚禮上缠黍,老公的妹妹穿的比我還像新娘弄兜。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布替饿。 她就那樣靜靜地躺著语泽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪视卢。 梳的紋絲不亂的頭發(fā)上踱卵,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音据过,去河邊找鬼惋砂。 笑死,一個胖子當著我的面吹牛绳锅,可吹牛的內(nèi)容都是我干的西饵。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼鳞芙,長吁一口氣:“原來是場噩夢啊……” “哼罗标!你這毒婦竟也來了?” 一聲冷哼從身側響起积蜻,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彻消,沒想到半個月后竿拆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡宾尚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年丙笋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煌贴。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡御板,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出牛郑,到底是詐尸還是另有隱情怠肋,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布淹朋,位于F島的核電站笙各,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏础芍。R本人自食惡果不足惜杈抢,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仑性。 院中可真熱鬧惶楼,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至窥岩,卻和暖如春甲献,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颂翼。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工晃洒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人朦乏。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓球及,卻偏偏與公主長得像,于是被迫代替她去往敵國和親呻疹。 傳聞我的和親對象是個殘疾皇子吃引,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 原文鏈接 http://blog.poetries.top/2016/10/20/review-jQuery 關注...
    程序員poetry閱讀 16,635評論 18 503
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,728評論 1 92
  • 1.JQuery 基礎 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式刽锤。設計者無需花費時間糾纏JS復雜的高級特性镊尺。 1....
    LaBaby_閱讀 1,325評論 0 2
  • 請參看我github中的wiki,不定期更新并思。https://github.com/ivonzhang/Front...
    zhangivon閱讀 7,105評論 2 19
  • 轉(zhuǎn)載自http://cnodejs.org/topic/5203a71844e76d216a727d2e 庐氮,略加美...
    vv源vv閱讀 1,245評論 0 50