GAS环境下Cheerio爬取meta标签content属性报错求解
问题根因
- 全局调用
$('[itemprop="name"]').attr('content')会匹配页面所有带该属性的标签,无法和单条观看记录一一对应,会出现取值错位 - 原有逻辑仅提取了标题
h3和日期span两类元素,脱离单条记录的父容器选择meta标签,很容易出现元素匹配失败、attr方法返回空值的问题
可运行修改方案
调整遍历逻辑,直接定位每条观看记录的父容器,在容器上下文内分别提取三个目标字段,避免元素配对错位,修改后完整代码如下:
/** * Returns Trakt watchlist by username * @param pages enter the number of pages in the list. Default is 10 * @customfunction */ function TRAKT(pages=10) { const username = `jerrylaslow` const maxPage = pages; const reqs = [...Array(maxPage)].map((_, i) => ({ url: `https://trakt.tv/users/`+ username +`/history/all/added?page=${i + 1}`, muteHttpExceptions: true })); return UrlFetchApp.fetchAll(reqs).flatMap((r, i) => { if (r.getResponseCode() != 200) { return [["Values couldn't be retrieved.", reqs[i].url]]; } const $ = Cheerio.load(r.getContentText()); const result = []; // 遍历所有观看记录条目容器 $('div.grid-item').each(function() { // 提取格式化观看日期 const rawDate = $(this).find('h4 > span.format-date').text().trim().replace(/T|Z/g, " "); const watchDate = Utilities.formatDate(new Date(rawDate), "GMT", "yyyy-MM-dd"); // 提取页面显示的标题文本 const displayTitle = $(this).find('a.titles-link > h3.ellipsify').text().trim(); // 提取目标meta标签的content属性值 const metaTitle = $(this).find('meta[itemprop="name"]').attr('content') || ""; result.push([watchDate, displayTitle, metaTitle]); }); return result; }); }
效果说明
- 脚本返回结果共三列:第一列为观看日期、第二列为页面显示的标题文本、第三列为你需要的meta标签content值(格式为
片名 (年份)),和IMPORTXML公式提取结果完全一致 - 去掉了原有splice拼接元素的逻辑,从根源避免不同字段错位的问题
- 给meta字段取值加了空值兜底,个别条目缺失对应标签时不会触发脚本报错
内容的提问来源于stack exchange,提问作者tomf
相关产品推荐
相关产品推荐

