使用正则表达式抓取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
相关产品推荐
相关产品推荐

