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

使用正则表达式抓取Morningstar数据时仅提取数值的问题求助

解决Morningstar基金页面提取目标数值的问题

看起来你遇到的问题是页面里有多个带line text类的<td>元素,你的正则不小心匹配到了错误的目标。咱们一步步拆解解决:

问题根源

  • 最初的正则/<td class="line text">(.*?)<\/td>/会匹配页面中第一个符合该类的<td>,刚好返回了带EUR的完整字符串;
  • 当你改成/<td class="line text">(\d.*?)<\/td>/时,匹配的是第一个以数字开头的同类型<td>——也就是页面里的百分比数值“1,09%”,而目标数值“EUR 20,66”是以字母开头的,自然不会被这个正则选中。

解决方案

我们可以用更精准的正则锁定目标元素,直接提取你需要的数字部分:

方法1:直接匹配包含EUR的目标<td>

这个正则专门定位内容以EUR 开头的line text类<td>,并捕获后面的数字:

function import1() {
  var html, content = '';
  var response = UrlFetchApp.fetch("https://www.morningstar.nl/nl/funds/snapshot/snapshot.aspx?id=F00000QIPC");
  if (response) {
    html = response.getContentText();
    // 匹配包含EUR的目标td,捕获数字部分
    var targetMatch = html.match(/<td class="line text">EUR (\d+,\d+)<\/td>/);
    if (targetMatch) {
      content = targetMatch[1];
      Logger.log(content); // 输出:20,66
    }
  }
  return content;
}

这里的(\d+,\d+)专门匹配20,66这类格式:\d+匹配整数部分,,\d+匹配逗号加小数部分。

方法2:关联表头增强鲁棒性

如果未来页面结构调整,line text类的位置发生变化,我们可以通过表头“Laatste koers”(最新价格)来定位对应的数值,这样更可靠:

function import1() {
  var html, content = '';
  var response = UrlFetchApp.fetch("https://www.morningstar.nl/nl/funds/snapshot/snapshot.aspx?id=F00000QIPC");
  if (response) {
    html = response.getContentText();
    // 先匹配表头行,再找对应的数值td
    var targetMatch = html.match(/<th>Laatste koers<\/th>.*?<td class="line text">EUR (\d+,\d+)<\/td>/s);
    if (targetMatch) {
      content = targetMatch[1];
      Logger.log(content); // 输出:20,66
    }
  }
  return content;
}

这里的/s修饰符让正则中的.可以匹配换行符,适配HTML代码通常换行排版的情况。

额外提醒

正则匹配HTML虽然快捷,但如果页面结构发生较大变化可能失效。如果需要更稳定的方案,可以尝试使用XmlService解析HTML(注意先处理不规范的HTML标签),不过对于这类简单的提取场景,精准的正则已经足够。

内容的提问来源于stack exchange,提问作者Mees Mouwen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 21:52:27