所謂工欲善其事,必先利其器,因此通讀了cheerio的API,順便翻譯了一遍,有些地方由於知道的比較少,不知道什麼意思,保留了英文,但願各位不吝告訴我,而後一塊兒把這個翻譯完成。html
###cheerio 爲服務器特別定製的,快速、靈活、實施的jQuery核心實現. ###Introduction 將HTML告訴你的服務器jquery
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>
###Installation npm install cheeriogit
###Features **❤ 類似的語法:**Cheerio 包括了 jQuery 核心的子集。Cheerio 從jQuery庫中去除了全部 DOM不一致性和瀏覽器尷尬的部分,揭示了它真正優雅的API。github
**ϟ 閃電般的塊:**Cheerio 工做在一個很是簡單,一致的DOM模型之上。解析,操做,呈送都變得難以置信的高效。基礎的端到端的基準測試顯示Cheerio 大約比JSDOM快八倍(8x)。npm
❁ 巨靈活: Cheerio 封裝了兼容的htmlparser。Cheerio 幾乎可以解析任何的 HTML 和 XML document。api
###What about JSDOM 我寫cheerio 是由於我發現我本身對JSDOM愈來愈沮喪。對於我來講,老是會一次又一次的碰上幾個難點。數組
- JSDOM內建的解析太過於嚴格: JSDOM附帶的HTML解析不能處理不少當下的大衆的網站。
- JSDOM太慢:用JSDOM解析大型網站存在可見的延遲。
- JSDOM太累贅:JSDOM的目標是提供一個咱們在瀏覽器裏面看到的相同的 DOM 環境。我從沒有真的須要全部這些東西,我只是想要一個簡單的,類似的方法去處理HTML。
###When I would use JSDOM Cheerio 不會解決你的全部問題。我人會使用JSDOM若是我須要用一個在服務器上的瀏覽器環境,特別是若是我想要自動化一些功能測試。 ###API ####咱們將用到的標記示例瀏覽器
- Apple
- Orange
- Pear
這是咱們將會在全部的API例子中用到的HTML標記服務器
####Loading 首先你須要加載HTML。這一步對jQuery來講是必須的,since jQuery operates on the one, baked-in DOM。經過Cheerio,咱們須要把HTML document 傳進去。app
這是首選:
var cheerio = require('cheerio'), $ = cheerio.load('<ul id="fruits">...</ul>');
或者經過傳遞字符串做爲內容來加載HTML:
$ = require('cheerio'); $('ul', '<ul id="fruits">...</ul>');
Or as the root:
$ = require('cheerio'); $('li', 'ul', '<ul id="fruits">...</ul>');
你也能夠傳遞一個額外的對象給.load()若是你須要更改任何的默認解析選項的話:
$ = cheerio.load('<ul id="fruits">...</ul>', { ignoreWhitespace: true, xmlMode: true });
這些解析選項都是直接來自htmlparser ,所以任何在htmlparser裏有效的選項在Chreeio裏也是行得通的。默認的選項以下:
{ ignoreWhitespace: false, xmlMode: false, lowerCaseTags: false }
####Selectors
Cheerio的選擇器用起來幾乎和jQuery同樣,因此API也很類似。
$(selectior,[context],[root])
選擇器在 Context 範圍內搜索,Context又在Root範圍內搜索。selector 和context但是是一個字符串表達式,DOM元素,和DOM元素的數組,或者chreeio對象。root 是一般是HTML 文檔字符串。
$('.apple', '#fruits').text() //=> Apple $('ul .pear').attr('class') //=> pear $('li[class=orange]').html() //=> <li class="orange">Orange</li>
####Attributes 得到和修改屬性
.attr(name,value)
得到和修改屬性。在匹配的元素中只能得到第一元素的屬性。若是設置一個屬性的值爲null,則移除這個屬性。你也能夠傳遞一對鍵值,或者一個函數。
$('ul').attr('id') //=> fruits $('.apple').attr('id', 'favorite').html() //=> <li class="apple" id="favorite">Apple</li>
更多信息請看這裏
value([value])
得到和修改input,select,textarea的value.注意: 對於傳遞鍵值和函數的支持尚未被加進去。
$('input[type="text"]').val() => input_text $('input[type="text"]').val('test').html() => <input type="text" value="test"/>
.removeAttr(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)
增長class(es)給全部匹配的elements.也能夠傳函數。
$('.pear').addClass('fruit').html() //=> <li class="pear fruit">Pear</li> $('.apple').addClass('fruit red').html() //=> <li class="apple fruit red">Apple</li>
更多信息看這裏
.removeClass([className])
從選擇的elements裏去除一個或多個有空格分開的class。若是className 沒有定義,全部的classes將會被去除,也能夠傳函數。
$('.pear').removeClass('pear').html() //=> <li class="">Pear</li> $('.apple').addClass('red').removeClass().html() //=> <li class="">Apple</li>
更多信息看這裏
.is.(selector)
.is(function(index))
有任何元素匹配selector就返回true。若是使用斷定函數,斷定函數在選中的元素中執行,因此this指向當前的元素。
####Traversing
.find(selector)
得到一個在匹配的元素中由選擇器濾過的後代。
$('#fruits').find('li').length //=> 3
.parent([selector])
得到每一個匹配元素的parent,可選擇性的經過selector篩選。
$('.pear').parent().attr('id') //=> fruits
.parents([selector])
得到經過選擇器篩選匹配的元素的parent集合。
$('.orange').parents().length // => 2 $('.orange').parents('#fruits').length // => 1
.closest([selector])
對於每一個集合內的元素,經過測試這個元素和DOM層級關係上的祖先元素,得到第一個匹配的元素
$('.orange').closest() // => [] $('.orange').closest('.apple') // => [] $('.orange').closest('li') // => [<li class="orange">Orange</li>] $('.orange').closest('#fruits') // => [<ul id="fruits"> ... </ul>]
.next() 得到第一個本元素以後的同級元素
$('.apple').next().hasClass('orange') //=> true
.nextAll()
得到本元素以後的全部同級元素
$('.apple').nextAll() //=> [<li class="orange">Orange</li>, <li class="pear">Pear</li>]
.prev()
得到本元素以前的第一個同級元素
$('.orange').prev().hasClass('apple') //=> true
.preAll()
$('.pear').prevAll() //=> [<li class="orange">Orange</li>, <li class="apple">Apple</li>]
得到本元素前的全部同級元素
.slice(start,[end])
得到選定範圍內的元素
$('li').slice(1).eq(0).text() //=> 'Orange' $('li').slice(1, 2).length //=> 1
.siblings(selector)
得到被選擇的同級元素,除去本身??
$('.pear').siblings().length //=> 2 $('.pear').siblings('.orange').length //=> 1
.children(selector)
獲被選擇元素的子元素
$('#fruits').children().length //=> 3 $('#fruits').children('.pear').text() //=> Pear
.each(function(index,element))
迭代一個cheerio對象,爲每一個匹配元素執行一個函數。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.要提前跳出循環,返回false.
var fruits = []; $('li').each(function(i, elem) { fruits[i] = $(this).text(); }); fruits.join(', '); //=> Apple, Orange, Pear
.map(function(index,element))
迭代一個cheerio對象,爲每一個匹配元素執行一個函數。Map會返回一個迭代結果的數組。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
.filter(selector)
.filter(function(index))
迭代一個cheerio對象,濾出匹配選擇器或者是傳進去的函數的元素。若是使用函數方法,這個函數在被選擇的元素中執行,因此this指向的手勢當前元素。
Selector:
$('li').filter('.orange').attr('class'); //=> orange
Function:
$('li').filter(function(i, el) { // this === el return $(this).attr('class') === 'orange'; }).attr('class') //=> orange
.first()
會選擇chreeio對象的第一個元素
$('#fruits').children().first().text() //=> Apple
.last()
$('#fruits').children().last().text() //=> Pear
會選擇chreeio對象的最後一個元素
.eq(i)
經過索引篩選匹配的元素。使用.eq(-i)就從最後一個元素向前數。
$('li').eq(0).text() //=> Apple $('li').eq(-1).text() //=> Pear
###Manipulation
改變DOM結構的方法
.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>
.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>
.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] )
從DOM中去除匹配的元素和它們的子元素。選擇器用來篩選要刪除的元素。
$('.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] )
得到元素的HTML字符串。若是htmlString有內容的話,將會替代原來的HTML
$('.orange').html() //=> Orange $('#fruits').html('<li class="mango">Mango</li>').html() //=> <li class="mango">Mango</li>
.text( [textString] )
得到元素的text內容,包括子元素。若是textString被指定的話,每一個元素的text內容都會被替換。
$('.orange').text() //=> Orange $('ul').text() //=> Apple // Orange // Pear
###Rendering
若是你想呈送document,你能使用html多效用函數。
$.html() //=> <ul id="fruits"> // <li class="apple">Apple</li> // <li class="orange">Orange</li> // <li class="pear">Pear</li> // </ul>
若是你想呈送outerHTML,你可使用 $.html(selector)
$.html('.pear') //=> <li class="pear">Pear</li>
默認的,html會讓一些標籤保持開標籤的狀態.有時候你想呈現一個有效的XML文檔.例以下面這個:
$ = cheerio.load('<media:thumbnail url="http://www.foo.com/keyframe.jpg" width="75" height="50" time="12:05:01.123"/>');
而後爲了呈現這個XML,你須要使用xml
這個函數:
$.xml() //=> <media:thumbnail url="http://www.foo.com/keyframe.jpg" width="75" height="50" time="12:05:01.123"/>
###Miscellaneous
不屬於其它地方的DOM 元素方法
.toArray()
取得全部的在DOM元素,轉化爲數組、
$('li').toArray() //=> [ {...}, {...}, {...} ]
.clone()
克隆cheerio對象
var moreFruit = $('#fruits').clone()
###Utilities
$.root 有時候你想找到最上層的root元素,那麼$.root()
就能得到:
$.root().append('<ul id="vegetables"></ul>').html(); //=> <ul id="fruits">...</ul><ul id="vegetables"></ul>
$.contains( container, contained )
查看cotained元素是不是container元素的子元素
$.parseHTML( data [, context ] [, keepScripts ] )
將字符串解析爲DOM節點數組。context參數對chreeio沒有意義,可是用來維護APi的兼容性。
轉載本站文章請註明出處:愛開發 http://www.imlwj.com/blog/?p=39