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》?焕盟?脑奠?
或者通過傳遞字符串作為內(nèi)容來加載HTML:
$ = require('cheerio');
$('ul', '<ul id="fruits">...</ul>');
《3》秆乳??怀浆?
或者作為根節(jié)點(diǎn)
$ = require('cheerio');
$('li', 'ul', '<ul id="fruits">...</ul>');
《4》
你也可以傳遞一個(gè)額外的對象給.load()如果你需要更改任何的默認(rèn)解析選項(xiàng)的話:
$ = cheerio.load('<ul id="fruits">...</ul>', {
ignoreWhitespace: true,
xmlMode: true
});
這些解析選項(xiàng)都是直接來自htmlparser 涧至,因此任何在htmlparser里有效的選項(xiàng)在Chreeio里也是行得通的。默認(rèn)的選項(xiàng)如下:
{
ignoreWhitespace: false,
xmlMode: false,
lowerCaseTags: false
}
4.###Selectors選擇器
$(selectior,[context],[root])
選擇器在 Context 范圍內(nèi)搜索纱皆,Context又在Root范圍內(nèi)搜索湾趾。selector 和context可是是一個(gè)字符串表達(dá)式,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)
獲得和修改屬性艺普。在匹配的元素中只能獲得第一元素的屬性。如果設(shè)置一個(gè)屬性的值為null鉴竭,則移除這個(gè)屬性歧譬。你也可以傳遞一對鍵值,或者一個(gè)函數(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ù)的支持還沒有被加進(jìn)去瑰步。
$('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里去除一個(gè)或多個(gè)有空格分開的class。如果className 沒有定義璧眠,所有的classes將會(huì)被去除缩焦,也可以傳函數(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指向當(dāng)前的元素靴拱。
10.####Traversing 遍歷
《1》.find(selector)獲得一個(gè)在匹配的元素中由選擇器濾過的后代垃喊。
$('#fruits').find('li').length
//=> 3
《2》.parent([selector])
獲得每個(gè)匹配元素的parent,可選擇性的通過selector篩選。
$('.pear').parent().attr('id')
//=> fruits
《3》.parents([selector])
獲得通過選擇器篩選匹配的元素的parent集合袜炕。
$('.orange').parents().length
// => 2
$('.orange').parents('#fruits').length
// => 1
《4》.closest([selector])
對于每個(gè)集合內(nèi)的元素本谜,通過測試這個(gè)元素和DOM層級關(guān)系上的祖先元素,獲得第一個(gè)匹配的元素
$('.orange').closest()
// => []
$('.orange').closest('.apple')
// => []
$('.orange').closest('li')
// => [<li class="orange">Orange</li>]
$('.orange').closest('#fruits')
// => [<ul id="fruits"> ... </ul>]
《5》.next()
獲得第一個(gè)本元素之后的同級元素
$('.apple').next().hasClass('orange')
//=> true
《6》nextAll()
獲得本元素之后的所有同級元素
$('.apple').nextAll()
//=> [<li class="orange">Orange</li>, <li class="pear">Pear</li>]
《7》.prev()
獲得本元素之前的第一個(gè)同級元素
$('.orange').prev().hasClass('apple')
//=> true
《8》.preAll()
$('.pear').prevAll()
//=> [<li class="orange">Orange</li>, <li class="apple">Apple</li>]
獲得本元素前的所有同級元素
《9》.slice(start,[end])
獲得選定范圍內(nèi)的元素
$('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))
迭代一個(gè)cheerio對象乌助,為每個(gè)匹配元素執(zhí)行一個(gè)函數(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))
迭代一個(gè)cheerio對象他托,為每個(gè)匹配元素執(zhí)行一個(gè)函數(shù)。Map會(huì)返回一個(gè)迭代結(jié)果的數(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))
迭代一個(gè)cheerio對象赏参,濾出匹配選擇器或者是傳進(jìn)去的函數(shù)的元素。如果使用函數(shù)方法,這個(gè)函數(shù)在被選擇的元素中執(zhí)行把篓,所以this指向的手勢當(dāng)前元素纫溃。
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()
會(huì)選擇chreeio對象的第一個(gè)元素
$('#fruits').children().first().text()
//=> Apple
《16》.last()
$('#fruits').children().last().text()
//=> Pear
會(huì)選擇chreeio對象的最后一個(gè)元素
《17》.eq(i)
通過索引篩選匹配的元素。使用.eq(-i)就從最后一個(gè)元素向前數(shù)韧掩。
$('li').eq(0).text()
//=> Apple
$('li').eq(-1).text()
//=> Pear
11.###Manipulation 改變DOM結(jié)構(gòu)的方法
《1》.append(content,[content…])
在每個(gè)元素最后插入一個(gè)子元素
$('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,…])
在每個(gè)元素最前插入一個(gè)子元素
$('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,…])
在每個(gè)匹配元素之后插入一個(gè)元素
$('.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,…])
在每個(gè)匹配的元素之前插入一個(gè)元素
$('.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中去除匹配的元素和它們的子元素紊浩。選擇器用來篩選要?jiǎng)h除的元素。
$('.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()
清空一個(gè)元素揍很,移除所有的子元素
$('ul').empty()
$.html()
//=> <ul id="fruits"></ul>
《8》.html( [htmlString] )
獲得元素的HTML字符串郎楼。如果htmlString有內(nèi)容的話,將會(huì)替代原來的HTML
$('.orange').html()
//=> Orange
$('#fruits').html('<li class="mango">Mango</li>').html()
//=> <li class="mango">Mango</li>
《9》.text( [textString] )
獲得元素的text內(nèi)容窒悔,包括子元素呜袁。如果textString被指定的話,每個(gè)元素的text內(nèi)容都會(huì)被替換简珠。
$('.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>
默認(rèn)的,html會(huì)讓一些標(biāo)簽保持開標(biāo)簽的狀態(tài).有時(shí)候你想呈現(xiàn)一個(gè)有效的XML文檔.例如下面這個(gè):
$ = cheerio.load('<media:thumbnail url="http://www.foo.com/keyframe.jpg" width="75" height="50" time="12:05:01.123"/>');
然后為了呈現(xiàn)這個(gè)XML,你需要使用xml這個(gè)函數(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元素聋庵,轉(zhuǎn)化為數(shù)組膘融、
$('li').toArray()
//=> [ {...}, {...}, {...} ]
《2》.clone() 克隆cheerio對象
var moreFruit = $('#fruits').clone()
###Utilities
《3》$.root
有時(shí)候你想找到最上層的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é)點(diǎn)數(shù)組。context參數(shù)對chreeio沒有意義祭玉,但是用來維護(hù)APi的兼容性氧映。
cheerio
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凤价,“玉大人鸽斟,你說我怎么就攤上這事×险蹋” “怎么了湾盗?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長立轧。 經(jīng)常有香客問我格粪,道長躏吊,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任帐萎,我火速辦了婚禮比伏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疆导。我一直安慰自己赁项,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布澈段。 她就那樣靜靜地躺著悠菜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪败富。 梳的紋絲不亂的頭發(fā)上悔醋,一...
- 文/蒼蘭香墨 我猛地睜開眼泽本,長吁一口氣:“原來是場噩夢啊……” “哼淘太!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起规丽,我...
- 序言:老撾萬榮一對情侶失蹤琴儿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后嘁捷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡显熏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年雄嚣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喘蟆。...
- 正文 年R本政府宣布橙弱,位于F島的核電站歧寺,受9級特大地震影響燥狰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斜筐,卻給世界環(huán)境...
- 文/蒙蒙 一龙致、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧顷链,春花似錦目代、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至煞抬,卻和暖如春霜大,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背此疹。 一陣腳步聲響...
- 正文 我出身青樓湖笨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蹦骑。 傳聞我的和親對象是個(gè)殘疾皇子慈省,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- React Native NavigatorIOS API 使用 通過學(xué)習(xí)React Native的Navigat...