如何用Google Apps Script抓取Yahoo Finance的Price/Book (mrq)数据?
问题分析与解决方案
现有代码的问题
- 变量名非法:
Price/Book中的/是JavaScript除法运算符,不能作为变量名,会直接触发语法错误,需改为合法标识符(如priceBookMatch)。 - 正则转义错误:UrlFetchApp获取的是原始HTML内容,标签使用
</>而非转义后的</>,正则里的转义字符会导致匹配失败。 - 正则匹配范围过宽:页面中存在大量
fin-streamer标签,无差别匹配会抓取到无关数据,需结合目标指标的上下文缩小范围。 - 未处理匹配失败场景:如果match返回
null,直接访问[1]会抛出运行时错误,必须先做判空处理。
修正后的代码
function yahooF() { const ticker = 'AAPL'; const url = `https://finance.yahoo.com/quote/${ticker}/key-statistics/`; const res = UrlFetchApp.fetch(url, {muteHttpExceptions: true}); const contentText = res.getContentText(); // 结合Price/Book (mrq)的上下文精准匹配数值 const priceBookRegex = /Price\/Book \(mrq\)[\s\S]*?<fin-streamer[^>]*>([\d,.]+)<\/fin-streamer>/; const priceBookMatch = contentText.match(priceBookRegex); if (priceBookMatch && priceBookMatch[1]) { const cleanResult = priceBookMatch[1].replace(',', ''); // 移除千分位逗号 console.log(cleanResult); return cleanResult; } else { console.log("未找到Price/Book数据"); return "N/A"; } }
抓取页面其他数据的方法
方法1:精准正则匹配
针对每个目标指标(如市盈率、市销率),先在页面HTML中找到该指标的文本标识(比如Price/Sales (ttm)),然后修改正则中的指标关键词即可。示例:
- 抓取「Price/Earnings (ttm)」的正则:
/Price\/Earnings \(ttm\)[\s\S]*?<fin-streamer[^>]*>([\d,.]+)<\/fin-streamer>/
方法2:使用Cheerio解析HTML(更稳定)
通过Apps Script导入Cheerio库(库ID:1ReeQ6WO8kKNxoaA_O0XEQ589cIrRvEBA9qcWpNqdOP17i47u6N9M5Xh0),用DOM选择器定位元素,避免正则维护的繁琐:
function yahooFWithCheerio() { const ticker = 'AAPL'; const url = `https://finance.yahoo.com/quote/${ticker}/key-statistics/`; const res = UrlFetchApp.fetch(url, {muteHttpExceptions: true}); const $ = Cheerio.load(res.getContentText()); // 抓取Price/Book (mrq) const priceBook = $('span:contains("Price/Book (mrq)")').parent().next().find('fin-streamer').text(); // 抓取Price/Earnings (ttm)示例 const peRatio = $('span:contains("Price/Earnings (ttm)")').parent().next().find('fin-streamer').text(); console.log(`Price/Book: ${priceBook}, PE Ratio: ${peRatio}`); return {priceBook, peRatio}; }
注意:使用前需在Apps Script编辑器中,通过「资源」→「库」添加上述库ID,并选择最新版本。
内容的提问来源于stack exchange,提问作者JohnTroublultra
相关产品推荐
相关产品推荐

