cheerio是一個node的庫,能夠理解爲一個Node.js版本的jquery,用來從網頁中以 css selector取數據,使用方式和jquery基本相同。css
npm install cheerio --save
var cheerio = require('cheerio')
var $ = cheerio.load('<h2 class="title">Hello world</h2>')
$('h2.title').text('Hello there!')
$('h2').addClass('welcome')
$.html()
//=> <h2 class="title welcome">Hello there!</h2>
複製代碼
能夠看出Cheerio 與jquery擁有類似的語法。事實上,Cheerio 從jQuery庫中去除了全部 DOM不一致性和瀏覽器尷尬的部分,性能更優。html
首先你須要加載HTML。這一步對jQuery來講是必須的,經過Cheerio,咱們須要把HTML document 傳進去,下面的代碼都針對以下代碼node
var html = '<ul id="fruits"> <li class="apple">Apple</li> <li class="orange">Orange</li> <li class="pear">Pear</li> </ul>'
//DOM結構以下
<ul id="fruits">
<li class="apple">Apple</li>
<li class="orange">Orange</li>
<li class="pear">Pear</li>
</ul>
var cheerio = require('cheerio'),
$ = cheerio.load(html);
複製代碼
$(selectior,[context],[root])
複製代碼
選擇器在 Context 範圍內搜索,Context又在Root範圍內搜索。注意:這裏是root在右,context在左。selector 和context能夠是一個字符串表達式,DOM元素,和DOM元素的數組,或者chreeio對象。root 是一般是HTML 文檔字符串。jquery
$('.apple', '#fruits').text()
//=> Apple
//id爲fruits,class爲apple的元素,先root後context
$('ul .pear').attr('class')
//=> pear
//class爲pear的ul元素
$('li[class=orange]').html()
//=> Orange
//class屬性爲orange的li元素
複製代碼
### attr()修改屬性git
attr(name,value)
複製代碼
得到和修改屬性。在匹配的元素中只能得到第一元素的屬性。若是設置一個屬性的值爲null,則移除這個屬性。你也能夠傳遞一對鍵值,或者一個函數。github
$('ul').attr('id')
//=> fruits
$('.apple').attr('id', 'favorite').html()
//=> <li class="apple" id="favorite">Apple</li>
$('.apple').attr('class', 'favorite').html()
//=> <li class="favorite">Apple</li>
複製代碼
經過name刪除屬性 $('.pear').removeAttr('class').html() //=> pearnpm
### prop()修改狀態值數組
$('input[type="checkbox"]').prop('checked')
//=> false
$('input[type="checkbox"]').prop('checked', true).val()
//=> ok
複製代碼
$('<div data-apple-color="red"></div>').data()
//=> { appleColor: 'red' }
$('<div data-apple-color="red"></div>').data('apple-color')
//=> 'red'
var apple = $('.apple').data('kind', 'mac')
apple.data('kind')
//=> 'mac'
複製代碼
$('input[type="text"]').val()
//=> input_text
$('input[type="text"]').val('test').html()
//=> <input type="text" value="test"/>
複製代碼
檢查匹配的元素是否有給出的類名瀏覽器
$('.pear').hasClass('pear')//=> true
$('apple').hasClass('fruit')//=> false
$('li').hasClass('pear')//=> true
複製代碼
增長class(es)給全部匹配的elements.也能夠傳函數。app
$('.pear').addClass('fruit').html()//=> <li class="pear fruit">Pear</li>
$('.apple').addClass('fruit red').html()//=> <li class="apple fruit red">Apple</li>
複製代碼
從選擇的elements裏去除一個或多個有空格分開的class。若是className 沒有定義,全部的classes將會被去除,也能夠傳函數
$('.pear').removeClass('pear').html()//=>Pear
$('.apple').addClass('red').removeClass().html()//=>Apple
複製代碼
得到一個在匹配的元素中由選擇器濾過的後代
$('#fruits').find('li').length//=> 3
複製代碼
得到經過選擇器篩選匹配的元素的parent集合
$('.orange').parents().length// => 2
$('.orange').parents('#fruits').length// => 1
複製代碼
$('.apple').next().hasClass('orange')//=> true
$('.pear').next().html()//=> null
複製代碼
得到本元素以後的全部同級元素 $('.apple').nextAll()//=> [
###prev() 得到本元素以前的第一個同級元素 $('.orange').prev().hasClass('apple')//=> true
得到本元素前的全部同級元素 $('.pear').prevAll()//=> [
### slice(start,[end]) 得到選定範圍內的元素數組 $('li').slice(1).eq(0).text()//=> 'Orange' $('li').slice(1, 2).length//=> 1
得到被選擇的同級元素(除去本身) $('.pear').siblings().length//=> 2 $('.pear').siblings('.orange').length//=> 1 $('.pear').siblings('.pear').length//=> 0
會選擇chreeio對象的第一個元素 ('#fruits').children().first().text()//=> Apple
會選擇chreeio對象的最後一個元素 $('#fruits').children().last().text()//=> Pear
經過索引篩選匹配的元素。使用.eq(-i)就從最後一個元素向前數。 $('li').eq(0).text()//=> Apple $('li').eq(-1).text()//=> Pear
獲被選擇元素的子元素 $('#fruits').children().length//=> 3 $('#fruits').children('.pear').text()//=> Pear
迭代一個cheerio對象,爲每一個匹配元素執行一個函數。要提前跳出循環,返回false.
var fruits = [];
$('li').each(function(i, elem) {
fruits[i] = $(this).text();
});
fruits.join(', ');
//=> Apple, Orange, Pear
複製代碼
迭代一個cheerio對象,爲每一個匹配元素執行一個函數。Map會返回一個迭代結果的數組。
$('li').map(function(i, el) {
return $(this).attr('class');
}).join(', ');
//=> apple, orange, pear
複製代碼
迭代一個cheerio對象,濾出匹配選擇器或者是傳進去的函數的元素。若是使用函數方法,這個函數在被選擇的元素中執行,因此this指向的手勢當前元素。
$('li').filter('.orange').attr('class');//=> orange
$('li').filter(function(i, el) {
// this === el
return $(this).attr('class') === 'orange';
}).attr('class')
//=> orange
複製代碼
在每一個元素最後插入一個子元素
$('ul').append('<li class="plum">Plum</li>')
$.html()
//=>
// <li class="apple">Apple</li>
// <li class="orange">Orange</li>
// <li class="pear">Pear</li>
// <li class="plum">Plum</li>//
複製代碼
在每一個元素最前插入一個子元素
$('ul').prepend('<li class="plum">Plum</li>')
$.html()
//=>
// <li class="plum">Plum</li>
// <li class="apple">Apple</li>
// <li class="orange">Orange</li>
// <li class="pear">Pear</li>
複製代碼
在每一個匹配元素以後插入一個元素
$('.apple').after('<li class="plum">Plum</li>')
$.html()
//=>
// <li class="apple">Apple</li>
// <li class="plum">Plum</li>
// <li class="orange">Orange</li>
// <li class="pear">Pear</li>
複製代碼
在每一個匹配的元素以前插入一個元素
$('.apple').before('<li class="plum">Plum</li>')
$.html()
//=>
// <li class="plum">Plum</li>
// <li class="apple">Apple</li>
// <li class="orange">Orange</li>
// <li class="pear">Pear</li>
複製代碼
從DOM中去除匹配的元素和它們的子元素。選擇器用來篩選要刪除的元素。
$('.pear').remove()
$.html()//=>
// <li class="apple">Apple</li>
// <li class="orange">Orange</li>
複製代碼
替換匹配的的元素
var plum = $('<li class="plum">Plum</li>')
$('.pear').replaceWith(plum)
$.html()
//=>
// <li class="apple">Apple</li>
// <li class="orange">Orange</li>
// <li class="plum">Plum</li>//
複製代碼
清空一個元素,移除全部的子元素
$('ul').empty()$.html()
複製代碼
得到元素的HTML字符串。若是htmlString有內容的話,將會替代原來的HTML
$('.orange').html()
//=> Orange
$('#fruits').html('<li class="mango">Mango</li>').html()
//=> <li class="mango">Mango</li>
複製代碼
得到元素的text內容,包括子元素。若是textString被指定的話,每一個元素的text內容都會被替換。
$('.orange').text()//=> Orange
$('ul').text()//=> Apple// Orange// Pear
複製代碼
var http = require("http");
function download(url, callback) {
http.get(url, function(res) {
var data = "";
res.on('data', function (chunk) {
data += chunk;
});
res.on("end", function() {
callback(data);
});
}).on("error", function() {
callback(null);
});
}
exports.download = download;
複製代碼
var cheerio = require("cheerio");
var loadUrl = require("./loadUrl");
var url = "http://www.example.com"
loadUrl.download(url, function(data) {console.log(data);});
複製代碼