跳到主要内容

加载文档

在本指南中,我们将介绍如何使用 Cheerio 加载文档以及何时 使用不同的加载方法。

提示

如果你熟悉 jQuery,那么这一步对你来说会很陌生。jQuery 操作的是一个由浏览器解析并提供的 DOM。而在 Cheerio 中,我们需要自己向其传入 HTML 文档。

各方法的可用情况

默认情况下,只有 load 方法可以使用。如果你正在使用的是最新的 NodeJS 版本,并且同时是按照 ES 模块导入(import)的(即,你的 文件名以 .mjs 作为扩展名,或者在 package.json 文件中设置了 type: "module")。你也可以直接使用 import 或 require 指令/函数加载 cheerio/lib/batteries

为什么会这样?

某些默认情况下不可用的方法依赖是否使用 node: 协议。此协议 仅支持 Node 12 版本中的 ES 模块。为了保持与 Node 12 版本的兼容性,我们只在按照 ES 模块导入(import)时支持包括 load 方法在内的所有方法。

load

load 方法是 Cheerio 用来解析 HTML 或 XML 文档的最基本方式。 该方法的参数是一个字符串形式的文档,返回值是一个 Cheerio 对象,然后,你就可以用该对象来遍历和操作文档了。

以下是 load 方法的使用示例:

import * as cheerio from 'cheerio';

const $ = cheerio.load(
'<html><head><title>Hello, world!</title></head></html>',
);

console.log($('h1').text());
// Output: Hello, world!
提示

与浏览器环境类似,如果 <html><head> 以及 <body> 元素不存在的话,load 方法会补全这些元素。你可以将 load 方法的第三个 参数设置为 false 来禁止这一行为。

const $ = cheerio.load('<ul id="fruits">...</ul>', null, false);

$.html();
//=> '<ul id="fruits">...</ul>'

有关 load 方法的更多信息,请参阅 API 文档

loadBuffer

loadBuffer 方法与 load 方法类似,但它的参数是一个 存储文档内容的 buffer 类型数据结构,而不是字符串。Cheerio 将运行 HTML 编码格式嗅探算法来确定文档的编码格式。 这对于二进制格式存储的文档来说非常有用,例如 从文件读取或从网络接收数据。

以下是一个如何使用 loadBuffer 方法的示例:

import * as cheerio from 'cheerio';
import * as fs from 'fs';

const buffer = fs.readFileSync('document.html');

const $ = cheerio.loadBuffer(buffer);

console.log($('title').text());
// Output: Hello, world!

有关 loadBuffer 方法的更多信息,请参阅 API 文档

stringStream

当从数据流(stream)中加载 HTML 文档且编码格式已知时,你可以 使用 stringStream 方法将其解析为 Cheerio 对象。

import * as cheerio from 'cheerio';
import * as fs from 'fs';

const writeStream = cheerio.stringStream({}, (err, $) => {
if (err) {
// Handle error
}

console.log($('title').text());
// Output: Hello, world!
});

fs.createReadStream('document.html', { encoding: 'utf8' }).pipe(writeStream);

有关 stringStream 方法的更多信息,请参阅 API 文档

decodeStream

从数据流(stream)中加载 HTML 文档时,如果其编码格式未知,你 可以使用 decodeStream 方法将其解析为 Cheerio 对象。该方法 将运行 HTML 编码格式嗅探算法来确定文档的编码 格式。

以下是一个如何使用 decodeStream 方法的示例:

import * as cheerio from 'cheerio';
import * as fs from 'fs';

const writeStream = cheerio.decodeStream({}, (err, $) => {
if (err) {
// Handle error
}

console.log($('title').text());
// Output: Hello, world!
});

fs.createReadStream('document.html').pipe(writeStream);

有关 decodeStream 方法的更多信息,请参阅 API 文档

fromURL

fromURL 方法可以根据 URL 加载文档。该方法 是异步的,因此需要使用 await (或 then )语法来访问 返回的 Cheerio 对象。

import * as cheerio from 'cheerio';

const $ = await cheerio.fromURL('https://example.com');

有关 fromURL 方法的更多信息,请参阅 API 文档

总结

Cheerio 提供了多种加载 HTML 文档并将其解析为 DOM 结构的方法。这些方法适用于不同的使用场景, 具体取决于 HTML 数据的类型和来源。建议您充分了解 每个方法的用法,然后选择最适合自己需要的方法。