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的兼容性。
cheerio
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
- 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...