如何在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
相关产品推荐
相关产品推荐

