You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Google Apps Script中用Cheerio将所有文本提取为数组

解决Google Apps Script中Cheerio提取HTML文本为数组的问题

问题场景

  • 需要将目标HTML指定区域内的所有文本提取为数组,每个独立文本内容对应数组的一个元素(如array[0] = "1.name"、array[1] = "2.id")
  • 部分元素的class包含空格、括号等特殊字符,直接用find()定位会报错
  • 当前代码仅能获取拼接后的整段文本,无法实现拆分需求

解决方案

1. 处理含特殊字符的Class选择器

HTML元素class属性中的空格代表多个class,带括号、美元符号的特殊字符需要通过以下方式处理:

  • 属性包含选择器:用[class*="目标class片段"]匹配包含指定片段的元素,例如$('h1[class*="C($c-link-text)"]')
  • 转义特殊字符:对括号这类CSS选择器特殊字符,用反斜杠转义,在JS字符串中需写双反斜杠,例如$('h1.Fz\\(24px\\)')

2. 遍历文本节点生成数组

避免直接用.text()拼接所有内容,改为遍历目标容器下的所有文本节点,过滤空白后生成数组:

完整代码示例

function getTextToArray() {
  const URL = "https://tw.stock.yahoo.com/d/s/major_2330.html";
  const source = UrlFetchApp.fetch(URL);
  const html = source.getContentText();

  const $ = Cheerio.load(html, { decodeEntities: false });
  const textArray = [];

  // 遍历目标容器下所有非SVG元素的文本节点,过滤空白内容
  $('#main-0-QuoteHeader-Proxy').find('*:not(svg)').contents().each(function() {
    if (this.type === 'text') {
      const trimmedText = $(this).text().trim();
      if (trimmedText) {
        textArray.push(trimmedText);
      }
    }
  });

  Logger.log(textArray);
  return textArray;
}

代码说明

  • 使用contents()获取节点的所有子内容(包括文本节点),筛选出类型为text的节点
  • 用trim()去除文本前后的空白字符,过滤掉空字符串,避免数组中出现无效元素
  • 添加:not(svg)排除SVG图标内的文本(如果不需要这类内容),可根据需求调整

精准提取特定元素文本示例

如果需要单独提取某个带特殊class的元素文本,比如标题:

// 使用属性包含选择器
const titleText = $('h1[class*="C($c-link-text)"]').text().trim();
// 或转义特殊字符的class选择器
const titleText = $('h1.Fz\\(24px\\)').text().trim();

内容的提问来源于stack exchange,提问作者Mike Wu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 08:22:20