跳至主要内容

使用 extract 方法提取数据

extract 方法允许您从 HTML 文档中提取数据并将其存储在对象中。该方法接受一个 map 对象作为参数,其中键是将在对象上创建的属性的名称,而值是要用于提取值的 selector 或描述符。

要使用 extract 方法,您首先需要导入库并加载 HTML 文档。例如

import * as cheerio from 'cheerio';

const $ = cheerio.load(`
<ul>
<li>One</li>
<li>Two</li>
<li class="blue sel">Three</li>
<li class="red">Four</li>
</ul>
`);

加载文档后,您可以在加载的对象上使用 extract 方法从文档中提取数据。

以下是一些关于如何使用 extract 方法的示例

// Extract the text content of the first .red element
const data = $.extract({
red: '.red',
});

这将返回一个包含 red 属性的对象,其值为第一个 .red 元素的文本内容。

要提取所有 .red 元素的文本内容,您可以将 selector 包含在数组中

// Extract the text content of all .red elements
const data = $.extract({
red: ['.red'],
});

这将返回一个包含 red 属性的对象,其值为所有 .red 元素的文本内容的数组。

要更具体地说明您要提取的内容,您可以传递一个包含 selectorvalue 属性的对象。例如,要提取第一个 .red 元素的文本内容和第一个 a 元素的 href 属性

const data = $.extract({
red: '.red',
links: {
selector: 'a',
value: 'href',
},
});

value 属性可用于指定要从所选元素中提取的属性的名称。在本例中,我们从 <a> 元素中提取 href 属性。这在幕后使用 Cheerio 的 prop 方法

value 默认值为 textContent,它提取元素的文本内容。

作为 prop 方法内部具有特殊逻辑的属性,href 将相对于文档的 URL 解析。使用 fromURL 加载文档时,文档的 URL 将自动设置。否则,请使用 baseURL 选项指定文档的 URL。

这里有许多可用的 props;请查看 prop 方法 以了解详细信息。例如,要提取所有 .red 元素的 outerHTML

const data = $.extract({
red: [
{
selector: '.red',
value: 'outerHTML',
},
],
});

您还可以通过将对象指定为 value 来从多个嵌套元素中提取数据。例如,要提取所有 .red 元素和第一个 <ul> 元素中的第一个 .blue 元素的文本内容,以及第二个 <ul> 元素中所有 .sel 元素的文本内容

const data = $.extract({
ul1: {
selector: 'ul:first',
value: {
red: ['.red'],
blue: '.blue',
},
},
ul2: {
selector: 'ul:eq(2)',
value: {
sel: ['.sel'],
},
},
});

这将返回一个包含 ul1ul2 属性的对象。ul1 属性将是一个包含 red 属性的对象,其值为第一个 ul 元素中所有 .red 元素的文本内容的数组,以及一个 blue 属性。ul2 属性将是一个包含 sel 属性的对象,其值为第二个 <ul> 元素中所有 .sel 元素的文本内容的数组。

最后,您可以将函数作为 value 属性传递。该函数将使用所选的每个元素以及属性的 key 调用

const data = $.extract({
links: [
{
selector: 'a',
value: (el, key) => {
const href = $(el).attr('href');
return `${key}=${href}`;
},
},
],
});

这将提取所有 <a> 元素的 href 属性,并以 links=href_value 的形式返回每个元素的字符串,其中 href_valuehref 属性的值。返回的对象将具有一个 links 属性,其值为这些字符串的数组。

综合示例

让我们从 GitHub 获取 Cheerio 的最新版本,并从发布页面中提取发布日期和发布说明

import * as cheerio from 'cheerio';

const $ = await cheerio.fromURL(
'https://github.com/cheeriojs/cheerio/releases',
);

const data = $.extract({
releases: [
{
// First, we select individual release sections.
selector: 'section',
// Then, we extract the release date, name, and notes from each section.
value: {
// Selectors are executed within the context of the selected element.
name: 'h2',
date: {
selector: 'relative-time',
// The actual release date is stored in the `datetime` attribute.
value: 'datetime',
},
notes: {
selector: '.markdown-body',
// We are looking for the HTML content of the element.
value: 'innerHTML',
},
},
},
],
});