当前位置:首页 > 问答 > 正文

Node.js HTML解析:如何使用Cheerio在Node.js中解析HTML并提取数据

本文目录导读:

Node.js HTML解析:如何使用Cheerio在Node.js中解析HTML并提取数据

  1. 🌐 开篇场景:老板让你快速提取100个网页数据?
  2. 🔧 第一步:安装工具,1分钟搞定
  3. 📝 第二步:写代码!像操作jQuery一样简单
  4. 🎯 核心技巧:Cheerio的5大必杀技
  5. ⚠️ 避坑指南:3个新手常犯错误
  6. 🚀 实战案例:30行代码实现新闻爬虫
  7. 💡 为什么选择Cheerio?
  8. 📌 2025年最新特性
  9. 🎉 最后送你一个彩蛋!

🚀 Node.js + Cheerio:三步搞定网页数据抓取!
(信息来源:2025-08 Cheerio官方文档及实战案例)


🌐 开篇场景:老板让你快速提取100个网页数据?

假设你是个前端开发者,老板突然甩给你一个任务:“把竞品网站的所有文章标题和链接爬下来,明天开会用!”
你打开网页一看,好家伙!全是动态加载的内容,用浏览器直接复制根本行不通,这时候,Node.js + Cheerio 就是你的救星!💪


🔧 第一步:安装工具,1分钟搞定

npm install cheerio axios  # 同时安装爬虫库和解析库

📝 第二步:写代码!像操作jQuery一样简单

const cheerio = require('cheerio');
const axios = require('axios');
// 1. 发送HTTP请求获取网页内容
axios.get('https://example.com/blog')
  .then(response => {
    // 2. 用Cheerio加载HTML
    const $ = cheerio.load(response.data);
    // 3. 像jQuery一样提取数据!
    $('article.post').each((index, element) => {
      const title = $(element).find('h2').text();
      const link = $(element).find('a').attr('href');
      console.log(`📌 ${title}: ${link}`);
    });
  })
  .catch(err => console.error('爬取失败!', err));

🎯 核心技巧:Cheerio的5大必杀技

  1. 精准选择器

    Node.js HTML解析:如何使用Cheerio在Node.js中解析HTML并提取数据

    $('.class#id[attr=value]')  // 类名+ID+属性三连击
    $('div > p:first-child')   // 精准定位子元素
  2. 属性操作

    $('img').attr('src', 'new.jpg');  // 批量修改图片地址
    $('a').removeAttr('target');     // 干掉所有链接的target属性

    修改**

    $('p').text('修改后的文本');  // 直接替换段落内容
    $('#header').html('<h1>新标题</h1>');  // 替换整个区块
  3. 条件过滤

    Node.js HTML解析:如何使用Cheerio在Node.js中解析HTML并提取数据

    $('li').filter('.active').each(...)  // 只处理激活状态的列表项
    $('input').not('[type=hidden]')    // 排除隐藏表单
  4. 伪类选择器

    $('tr:even')  // 表格隔行变色
    $('input:checked')  // 获取所有选中的复选框

⚠️ 避坑指南:3个新手常犯错误

  1. 忘记加载HTML
    ❌ 错误:const $ = cheerio;
    ✅ 正确:const $ = cheerio.load(htmlString);

  2. 选择器写错位置
    ❌ 错误:$('div').find('p').text()(可能返回undefined)
    ✅ 正确:先检查元素是否存在:if ($('div p').length > 0) { ... }

  3. 忽略编码问题
    ❌ 错误:直接解析中文网页导致乱码
    ✅ 正确:加载时指定编码:cheerio.load(html, { decodeEntities: false });


🚀 实战案例:30行代码实现新闻爬虫

const fetchNews = async () => {
  const { data } = await axios.get('https://news.ycombinator.com');
  const $ = cheerio.load(data);
  const articles = [];
  $('a.storylink').each((i, elem) => {
    articles.push({
      title: $(elem).text(),
      url: $(elem).attr('href'),
      score: $(elem).closest('tr').next().find('.score').text()
    });
  });
  console.log('📰 今日热门文章:', articles.slice(0, 5));
};
fetchNews();

💡 为什么选择Cheerio?

  • 🚀 性能怪兽:比JSDOM快8倍,解析10万行HTML只需0.3秒
  • 🧩 jQuery语法:会jQuery就能秒上手
  • 🔌 插件生态:支持XML解析、CSS选择器扩展
  • 📦 轻量级:压缩后仅28KB,比一个图片还小

📌 2025年最新特性

  1. 支持Node.js 20.x:完美兼容ES Modules和Top-LevelAwait
  2. XML模式增强cheerio.load(xml, { xmlMode: true })
  3. 流式解析:处理超大文件时内存占用降低90%

🎉 最后送你一个彩蛋!

想快速测试选择器?直接在浏览器控制台运行:

const $ = require('cheerio').load(document.documentElement.outerHTML);
$('div.content').text();  // 立即看到结果!

你准备好用Cheerio征服数据世界了吗?💻

发表评论