Node.js 中的 HTML 解析:最佳库与工具概览

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 JavaScript (Node.js) 中解析 HTML:处理网页的工具选择



HTML 解析是开发网络爬虫、内容分析器和自动化测试时的关键任务之一。在 Node.js 生态系统中,存在几个强大的库,每个都有其独特的优势。在本文中,我们将介绍三种主要工具:cheerio、jsdom 和 htmlparser2,并分析何时以及哪种工具最适合使用。



1. Cheerio —— 服务端的 jQuery



cheerio 库是 Node.js 中解析 HTML 最流行的选择。它提供了熟悉的 jQuery 风格语法,用于导航和操作 DOM 树。Cheerio 不会创建完整的浏览器 DOM,而是使用轻量级的抽象,这使得它非常快速。



主要功能:

  • 支持 CSS 选择器(如同 jQuery)
  • 快速解析,无需执行 JavaScript
  • 不可变方法(不修改原始 HTML)
  • 处理属性、文本和 HTML 结构


使用示例:

const cheerio = require('cheerio');const html = '<div class="content"><h1>你好,世界!</h1><p>文章文本</p></div>';

const $ = cheerio.load(html);const title = $('h1').text();const paragraphs = $('p').map((i, el) => $(el).text()).get();

console.log(title); // "你好,世界!"console.log(paragraphs); // ["文章文本"]


2. JSDOM —— Node.js 中的完整浏览器



如果您不仅需要解析静态 HTML,还需要执行 JavaScript 脚本、模拟事件或使用现代 API(例如 fetch、localStorage),那么 jsdom 就是您的选择。它创建了一个完整的浏览器环境,提供了最大的兼容性,但需要更多资源。



何时使用 jsdom:

  • 动态内容的网站(基于 React/Vue 的 SPA)
  • 需要执行页面脚本
  • 测试 Web 组件
  • 处理事件和异步操作


解析示例:

const { JSDOM } = require('jsdom');const html = '<html><body><div id="app">内容</div></body></html>';

const dom = new JSDOM(html);const document = dom.window.document;const content = document.getElementById('app').textContent;

console.log(content); // "内容"


3. Htmlparser2 —— 极致性能



htmlparser2 库是一个基于事件驱动的底层解析器(类似 SAX 方式)。它不创建 DOM 树,而是在遇到每个标签、属性或文本节点时生成事件。这使其成为 Node.js 中最快的解析器。



特点:

  • 流式处理(可以解析 GB 级别的文件)
  • 内存占用极小
  • 支持 XML 和 HTML
  • 没有内置的导航方法(需要自行编写逻辑)


使用示例:

const htmlparser2 = require('htmlparser2');const html = '<div class="item">商品 1</div><div class="item">商品 2</div>';

const items = [];const parser = new htmlparser2.Parser({ onopentag(name, attribs) { if (name === 'div' && attribs.class === 'item') { this.currentItem = ''; } }, ontext(text) { if (this.currentItem !== undefined) { this.currentItem += text; } }, onclosetag(name) { if (name === 'div' && this.currentItem !== undefined) { items.push(this.currentItem.trim()

推荐