cheerio


1.###簡介
cheerio 就是在nodejs中用jquery的方式解析dom
Cheerio 幾乎能夠解析任何的 HTML 和 XML document

2.###例子
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>




3.###加載
 <ul id="fruits">
    <li class="apple">Apple</li>
    <li class="orange">Orange</li>
    <li class="pear">Pear</li>
 </ul>
《1》
    var cheerio = require('cheerio'),
    $ = cheerio.load('<ul id="fruits">...</ul>');

《2》???
    或者通過傳遞字符串作為內容來加載HTML:
    $ = require('cheerio');
    $('ul', '<ul id="fruits">...</ul>');
《3》???
    或者作為根節(jié)點
    $ = require('cheerio');
    $('li', 'ul', '<ul id="fruits">...</ul>');
《4》
    你也可以傳遞一個額外的對象給.load()如果你需要更改任何的默認解析選項的話:
    $ = cheerio.load('<ul id="fruits">...</ul>', {
        ignoreWhitespace: true,
        xmlMode: true
    });
    這些解析選項都是直接來自htmlparser ,因此任何在htmlparser里有效的選項在Chreeio里也是行得通的。默認的選項如下:
    {
        ignoreWhitespace: false,
        xmlMode: false,
        lowerCaseTags: false
    }

4.###Selectors選擇器
    $(selectior,[context],[root])
    選擇器在 Context 范圍內搜索,Context又在Root范圍內搜索。selector 和context可是是一個字符串表達式,DOM元素,和DOM元素的數(shù)組,或者chreeio對象。root 是通常是HTML 文檔字符串。
《2》注意'#fruits'是搜索的范圍
    $('.apple', '#fruits').text()
    //=> Apple

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

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


5.####Attributes 獲得和修改屬性
    .attr(name,value)

    獲得和修改屬性。在匹配的元素中只能獲得第一元素的屬性。如果設置一個屬性的值為null,則移除這個屬性。你也可以傳遞一對鍵值,或者一個函數(shù)。

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

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

6.value([value])
    獲得和修改input,select,textarea的value.注意: 對于傳遞鍵值和函數(shù)的支持還沒有被加進去。

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

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

7.removeAttr(name) 通過name刪除屬性
    $('.pear').removeAttr('class').html()
    //=> <li>Pear</li>

8.class操作
《1》hasClass( className ) 檢查匹配的元素是否有給出的類名
    $('.pear').hasClass('pear')
    //=> true
    $('apple').hasClass('fruit')
    //=> false
    $('li').hasClass('pear')
    //=> true
    
《2》removeClass([className])
    從選擇的elements里去除一個或多個有空格分開的class。如果className 沒有定義,所有的classes將會被去除,也可以傳函數(shù)。

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

    $('.apple').addClass('red').removeClass().html()
    //=> <li class="">Apple</li>
《3》.addClass(className)
    增加class(es)給所有匹配的elements.也可以傳函數(shù)。
    $('.pear').addClass('fruit').html()
    //=> <li class="pear fruit">Pear</li>
    $('.apple').addClass('fruit red').html()
    //=> <li class="apple fruit red">Apple</li>

9.????
    .is.(selector)

    .is(function(index))

    有任何元素匹配selector就返回true。如果使用判定函數(shù),判定函數(shù)在選中的元素中執(zhí)行,所以this指向當前的元素。


10.####Traversing 遍歷

《1》.find(selector)獲得一個在匹配的元素中由選擇器濾過的后代。
    $('#fruits').find('li').length
    //=> 3
    
《2》.parent([selector])
    獲得每個匹配元素的parent,可選擇性的通過selector篩選。
    $('.pear').parent().attr('id')
    //=> fruits
    
《3》.parents([selector])
    獲得通過選擇器篩選匹配的元素的parent集合。
    $('.orange').parents().length
    // => 2
    $('.orange').parents('#fruits').length
    // => 1

《4》.closest([selector])
    對于每個集合內的元素,通過測試這個元素和DOM層級關系上的祖先元素,獲得第一個匹配的元素
    $('.orange').closest()
    // => []
    $('.orange').closest('.apple')
    // => []
    $('.orange').closest('li')
    // => [<li class="orange">Orange</li>]
    $('.orange').closest('#fruits')
    // => [<ul id="fruits"> ... </ul>]

《5》.next()
    獲得第一個本元素之后的同級元素
    $('.apple').next().hasClass('orange')
    //=> true

《6》nextAll()
    獲得本元素之后的所有同級元素
    $('.apple').nextAll()
    //=> [<li class="orange">Orange</li>, <li class="pear">Pear</li>]
    
《7》.prev()
    獲得本元素之前的第一個同級元素
    $('.orange').prev().hasClass('apple')
    //=> true
    
《8》.preAll()
    $('.pear').prevAll()
    //=> [<li class="orange">Orange</li>, <li class="apple">Apple</li>]
    獲得本元素前的所有同級元素

《9》.slice(start,[end])
    獲得選定范圍內的元素
    $('li').slice(1).eq(0).text()
    //=> 'Orange'
    $('li').slice(1, 2).length
    //=> 1

《10》.siblings(selector)
    獲得被選擇的同級元素,除去自己
    $('.pear').siblings().length
    //=> 2
    $('.pear').siblings('.orange').length
    //=> 1
《11》.children(selector)
    獲被選擇元素的子元素
    $('#fruits').children().length
    //=> 3
    $('#fruits').children('.pear').text()
    //=> Pear
《12》.each(function(index,element))
    迭代一個cheerio對象,為每個匹配元素執(zhí)行一個函數(shù)。When the callback is fired, the function is fired in the context of the DOM element, so this refers to the current element, which is equivalent to the function parameter element.要提早跳出循環(huán),返回false.
    var fruits = [];
    $('li').each(function(i, elem) {
      fruits[i] = $(this).text();
    });
    fruits.join(', ');
    //=> Apple, Orange, Pear
    
《13》.map(function(index,element))
    迭代一個cheerio對象,為每個匹配元素執(zhí)行一個函數(shù)。Map會返回一個迭代結果的數(shù)組。the function is fired in the context of the DOM element, so this refers to the current element, which is equivalent to the function parameter element

    $('li').map(function(i, el) {
      // this === el
      return $(this).attr('class');
    }).join(', ');
    //=> apple, orange, pear
    
《14》.filter(selector)
    .filter(function(index))
    迭代一個cheerio對象,濾出匹配選擇器或者是傳進去的函數(shù)的元素。如果使用函數(shù)方法,這個函數(shù)在被選擇的元素中執(zhí)行,所以this指向的手勢當前元素。

    Selector:
    $('li').filter('.orange').attr('class');
    //=> orange
    Function:
    $('li').filter(function(i, el) {
      // this === el
      return $(this).attr('class') === 'orange';
    }).attr('class')
    //=> orange
    
《15》.first()
    會選擇chreeio對象的第一個元素

    $('#fruits').children().first().text()
    //=> Apple
    
《16》.last()

    $('#fruits').children().last().text()
    //=> Pear
    會選擇chreeio對象的最后一個元素

《17》.eq(i)

    通過索引篩選匹配的元素。使用.eq(-i)就從最后一個元素向前數(shù)。
    $('li').eq(0).text()
    //=> Apple
    $('li').eq(-1).text()
    //=> Pear

11.###Manipulation 改變DOM結構的方法

《1》.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>
    
《2》.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>
    
《3》.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>
    
《4》.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>
    
《5》.remove( [selector] )
    從DOM中去除匹配的元素和它們的子元素。選擇器用來篩選要刪除的元素。

    $('.pear').remove()
    $.html()
    //=>  <ul id="fruits">
    //      <li class="apple">Apple</li>
    //      <li class="orange">Orange</li>
    //    </ul>
    
《6》.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>
    
《7》.empty()
    清空一個元素,移除所有的子元素

    $('ul').empty()
    $.html()
    //=>  <ul id="fruits"></ul>
    
《8》.html( [htmlString] )
    獲得元素的HTML字符串。如果htmlString有內容的話,將會替代原來的HTML

    $('.orange').html()
    //=> Orange
    $('#fruits').html('<li class="mango">Mango</li>').html()
    //=> <li class="mango">Mango</li>
    
《9》.text( [textString] )
    獲得元素的text內容,包括子元素。如果textString被指定的話,每個元素的text內容都會被替換。

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

    $('ul').text()
    //=>  Apple
    //    Orange
    //    Pear
    
11.###Rendering 如果你想呈送document,你能使用html多效用函數(shù)。 

《1》$.html()
    //=>  <ul id="fruits">
    //      <li class="apple">Apple</li>
    //      <li class="orange">Orange</li>
    //      <li class="pear">Pear</li>
    //    </ul>
    如果你想呈送outerHTML,你可以使用 $.html(selector)

《2》$.html('.pear')
    //=> <li class="pear">Pear</li>
    默認的,html會讓一些標簽保持開標簽的狀態(tài).有時候你想呈現(xiàn)一個有效的XML文檔.例如下面這個:

    $ = cheerio.load('<media:thumbnail url="http://www.foo.com/keyframe.jpg" width="75" height="50" time="12:05:01.123"/>');
    然后為了呈現(xiàn)這個XML,你需要使用xml這個函數(shù):

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

12.###Miscellaneous 不屬于其它地方的DOM 元素方法

《1》.toArray()
    取得所有的在DOM元素,轉化為數(shù)組、

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

《2》.clone() 克隆cheerio對象

    var moreFruit = $('#fruits').clone()
    ###Utilities

《3》$.root
    有時候你想找到最上層的root元素,那么$.root()就能獲得:

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

《4》$.contains( container, contained ) 
    查看cotained元素是否是container元素的子元素

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

    將字符串解析為DOM節(jié)點數(shù)組。context參數(shù)對chreeio沒有意義,但是用來維護APi的兼容性。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,067評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,467評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,468評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,184評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,582評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,794評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 49,343評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,096評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,291評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,513評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,941評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,190評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,026評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,253評論 2 375

推薦閱讀更多精彩內容

  • 我只記得:我一生渴望被人收藏好,妥善安放,細心保存。免我驚,免我苦,免我四下流離,免我無枝可依!卻忘...
    flying毛毛閱讀 270評論 0 2
  • React Native NavigatorIOS API 使用 通過學習React Native的Navigat...
    MsgIM閱讀 775評論 0 0
  • 如果不談政治,我一直試圖揣摩陶潛寫下《歸去來兮辭》時的心境,是逃避還是看破?是放下還是執(zhí)著? “悟已往之不諫,知來...
    卜寸閱讀 190評論 2 4