node中使用cheerio爬取并解析html網(wǎng)頁

cheerio用于node環(huán)境,用法與語法都類似于jquery。jquery本身也可以用于node,在借助于第三方庫jsdom的情況下,詳見:https://www.npmjs.com/package/jquery

安裝

npm install cheerio

使用

const cheerio = require('cheerio')
const $ = cheerio.load('<h2 class="title">Hello world</h2>')
 
$('h2.title').text('Hello there!')
$('h2').addClass('welcome')
 
$.html()
//=> <html><head></head><body><h2 class="title welcome">Hello there!</h2></body></html>

運(yùn)用

場景

取出這個(gè)網(wǎng)址中的文章列表:https://support.fcoin.com/hc/zh-cn/sections/360000782633-最新公告

分析html源碼

重點(diǎn)關(guān)注class="article-list-link"的<a>,提取它里attr屬性與text內(nèi)容,就算完成目標(biāo)了。

<ul class="article-list">
          
            <li class="article-list-item ">
              
              <a href="/hc/zh-cn/articles/360006803454-FT%E9%A2%84%E5%85%88%E5%8F%91%E8%A1%8C%E9%83%A8%E5%88%86%E5%AE%9E%E8%A1%8C-%E8%A7%A3%E5%86%BB%E5%8D%B3%E9%94%81%E4%BB%93-%E5%8E%9F%E5%88%99%E7%9A%84%E5%85%AC%E5%91%8A" class="article-list-link">FT預(yù)先發(fā)行部分實(shí)行“解凍即鎖倉”原則的公告</a>
            </li>
          
            <li class="article-list-item ">
              
              <a href="/hc/zh-cn/articles/360006823933-%E5%85%B3%E4%BA%8EFInsur%E8%BF%90%E4%BD%9C%E6%9C%BA%E5%88%B6%E7%9A%84%E4%B8%80%E7%B3%BB%E5%88%97%E8%AF%B4%E6%98%8E" class="article-list-link">關(guān)于FInsur運(yùn)作機(jī)制的一系列說明</a>
            </li>
...
代碼與注釋說明
var request = require('request')
const cheerio = require('cheerio')

var http = (uri) => {
  return new Promise((resolve, reject) => {
    request({
      uri: uri,
      method: 'GET'
    }, (err, response, body) => {
      if (err) {
        console.log(err)
      }
      resolve(body)
    })
  })
}

(function () {
  // 定義目標(biāo)網(wǎng)址
  var target = 'https://support.fcoin.com/hc/zh-cn/sections/360000782633-%E6%9C%80%E6%96%B0%E5%85%AC%E5%91%8A'
  // 使用request.js庫發(fā)送get請(qǐng)求
  http(target).then(html => {
    // 載入并初始化cheerio
    const $ = cheerio.load(html)
    // 取出目標(biāo)節(jié)點(diǎn),即帶article-list-link css類的<a>
    var linksDom = $('a.article-list-link')
    // 遍歷dom集數(shù)組
    linksDom.each((index, item) => {
      // 取出title,注意這里使用了$(item),而不是item本身
      var title = $(item).text()
      // 類似地,取出鏈接地址
      var url = $(item).attr('href')
      // 解碼可選,為了讓結(jié)果顯示中文漢字更直觀
      url = decodeURIComponent(url)
      // 由于href使用的是相對(duì)于根目標(biāo)的路徑,因而從目標(biāo)網(wǎng)址中提取域名前綴拼接上
      url = target.match(/(\w+:\/\/[^/:]+)([^# ]*)/)[1] + url
      // 輸出到控制臺(tái)預(yù)覽結(jié)果
      console.log(title)
      console.log(url)
    })
  })
})()

預(yù)覽結(jié)果

result.png

對(duì)比說明

相比純正則表達(dá)式解析,使用cheerio輕松,語義也清晰,特別適合html文本這種特定環(huán)境下使用。

mp
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容