【问题标题】:ImportXML not producing correct valuesImportXML 没有产生正确的值
【发布时间】:2022-01-17 17:30:05
【问题描述】:

我正在按照以下教程将股票期权数据导入 Google 表格。

https://www.youtube.com/watch?v=Be7z9YeeVY0&ab_channel=daneshj

以下公式会将来自 yahoo Finance 的数据导入工作表:

=iferror(TRANSPOSE(IMPORTXML(CONCATENATE("https://finance.yahoo.com/quote/",A2,"?p=",A2),"//tr")),"You have to add a contract name in column A")

乍一看,一切看起来都很好,因为它似乎正在从网页中拉回数据;但是,所有值都不正确

在此示例中它从中提取数据的 URL 如下所示。请注意,数据经常更改。

https://finance.yahoo.com/quote/NKLA220121C00002500?p=NKLA220121C00002500

这些数字不仅在这个特定示例中是错误的,而且每次都是错误的,而且误差幅度足够大,我不认为这是由于 IMPORTXML 缓存页面造成的。我搜索了网页的 HTML 源代码,但在任何地方都找不到来自 IMPORTXML 的值。

【问题讨论】:

  • 我有一个问题。在您的标签中,包含google-apps-script。为此,我提出了一个使用 Google Apps 脚本作为答案的解决方法。你能确认一下吗?如果这与您的方向不同,我深表歉意。

标签: google-apps-script google-sheets google-sheets-formula


【解决方案1】:

问题和解决方法:

  • 当我测试您的=iferror(TRANSPOSE(IMPORTXML("https://finance.yahoo.com/quote/NKLA220121C00002500?p=NKLA220121C00002500","//tr")),"You have to add a contract name in column A") 示例公式时,我可以确认您的问题的相同情况。
  • 另一方面,当我从 URL 中检索 HTML 数据时,我可以确认与浏览器看到的页面的值相同。看来这和你的底部图片一样。
  • 很遗憾,我无法理解造成这种差异的明确原因。

从这些情况,在这个答案中,我想建议使用 Google Apps Script。

示例脚本:

请将以下脚本复制并粘贴到 Google 电子表格的容器绑定脚本中并保存。请把=SAMPLE("https://finance.yahoo.com/quote/NKLA220121C00002500?p=NKLA220121C00002500") 放到一个单元格中。由此,返回结果。在这种情况下,Google Apps 脚本用作自定义函数。

function SAMPLE(url) {
  const res = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
  const tables = [...res.getContentText().matchAll(/(<table[\w\s\S]+?<\/table>)/g)];
  if (tables.length < 2) return "No tables. Please confirm URL again.";
  const values = tables.reduce((ar, [,table]) => {
    if (table) {
      const root = XmlService.parse(table).getRootElement();
      const temp = root.getChild("tbody", root.getNamespace()).getChildren().map(e => e.getChildren().map(f => isNaN(f.getValue()) ? f.getValue() : Number(f.getValue())));
      ar = ar.concat(temp);
    }
    return ar;
  }, []);
  return values[0].map((_, i) => values.map(r => r[i]));
}

结果:

注意:

我针对https://finance.yahoo.com/quote/NKLA220121C00002500?p=NKLA220121C00002500 的URL 测试了这个示例脚本。更改 URL 后,脚本可能无法使用。所以请注意这一点。届时,请分析每个 HTML 数据并修改脚本。

参考资料:

【讨论】:

  • 确实是很奇怪的问题。感谢您的解决方法。
  • @Evan Hessler 感谢您的回复。我很高兴你的问题得到了解决。起初,我认为结果值可能取决于访问区域。但是我找不到用于提供访问区域的查询参数。所以我建议使用 Google Apps Script。
  • 聪明的主意!再次感谢:)
  • 这对我有用。有没有办法删除标题字段,以便只返回值并填充单元格?本质上,我希望在 A 列中的许多不同代码上使用它,为每个行创建行,我不需要标题行,但无法弄清楚如何从脚本中删除它。
  • @mdkb 感谢您的评论。关于你的问题,在这种情况下,从return values[0].map((_, i) =&gt; values.map(r =&gt; r[i])); 修改为const [,...v] = values[0].map((_, i) =&gt; values.map(r =&gt; r[i])); return v; 怎么样?这样,我认为可以删除标题行。如果我误解了您的问题,我深表歉意。
猜你喜欢
  • 2016-01-09
  • 1970-01-01
  • 2017-04-30
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
相关资源
最近更新 更多