【问题标题】:Google sheets IMPORTXML fails for ASX dataGoogle 表格 IMPORTXML 对 ASX 数据失败
【发布时间】:2025-12-04 06:25:01
【问题描述】:

我正在尝试从 https://finance.yahoo.com/ 中为不同市场的多家公司提取“远期股息和收益率”值,并将其提取到 Google 表格中。

这是成功的:

=IMPORTXML("https://finance.yahoo.com/quote/WBS", "//*[@id='quote-summary']/div[2]/table/tbody/tr[6]/td[2]")

但这会因#N/A 失败:

=IMPORTXML("https://finance.yahoo.com/quote/CBA.AX", "//*[@id='quote-summary']/div[2]/table/tbody/tr[6]/td[2]")

我无法确定 ASX 股票代码的不同之处,为什么 CBA.AX 会导致问题?

非常感谢您的帮助

【问题讨论】:

    标签: google-sheets-formula


    【解决方案1】:

    我在测试=IMPORTXML("https://finance.yahoo.com/quote/CBA.AX", "//*")的公式时,出现了Error Resource at url not found.的错误。我认为这可能是您的问题的原因。

    但是,幸运的是,当我尝试使用 Google Apps 脚本从同一 URL 检索 HTML 时,可以检索到 HTML。因此,在这个答案中,我想建议使用 Google Apps 脚本创建的自定义函数来检索值。示例脚本如下。

    示例脚本:

    请将以下脚本复制并粘贴到 Google 电子表格的脚本编辑器中并保存。并且,请将=SAMPLE("https://finance.yahoo.com/quote/CBA.AX") 的公式放入单元格中。这样,值就被检索到了。

    function SAMPLE(url) {
      const res = UrlFetchApp.fetch(url).getContentText().match(/DIVIDEND_AND_YIELD-value.+?>(.+?)</);
      return res && res.length > 1 ? res[1] : "No value";
    }
    

    结果:

    使用上述脚本时,得到如下结果。

    注意:

    • 使用此脚本时,也可以使用=SAMPLE("https://finance.yahoo.com/quote/WBS")
    • 在这种情况下,当 URL 的 HTML 结构发生变化时,该脚本可能无法使用。我认为这种情况与IMPORTXML 和xpath 相同。所以请注意这一点。

    参考资料:

    【讨论】:

    • 感谢您的时间和解决方案 :)
    • @Auckland_Ted 感谢您的回复。但我必须为我糟糕的英语水平道歉。不幸的是,从I appreciate your time and solution :) 和目前的情况来看,我无法理解您的问题是否可以解决。可以问一下您目前的情况吗?
    【解决方案2】:

    另一种解决方案是对网页源中包含的 json 进行解码。当然,您不能使用 importxml,因为网页是通过 javascript 而不是在服务器端构建的。通过这种方式可以访问数据,获取大量信息

      var source = UrlFetchApp.fetch(url).getContentText()
      var jsonString = source.match(/(?<=root.App.main = ).*(?=}}}})/g) + '}}}}'
    

    即对于您正在寻找的东西,您可以使用

    function trailingAnnualDividendRate(){
      var url='https://finance.yahoo.com/quote/CBA.AX'
      var source = UrlFetchApp.fetch(url).getContentText()
      var jsonString = source.match(/(?<=root.App.main = ).*(?=}}}})/g) + '}}}}'
      var data = JSON.parse(jsonString)
      var dividendRate = data.context.dispatcher.stores.QuoteSummaryStore.summaryDetail.trailingAnnualDividendRate.raw
      Logger.log(dividendRate)
    }
    

    【讨论】:

    • 感谢您的回复,这会是更好的解决方案吗?我对网络抓取/编码非常陌生,目前正在努力适应他人的代码。
    • 田池以前的解决方案可以满足您的需求,这可能就足够了。我正在寻找的是从 json 中检索大量信息。 docs.google.com/spreadsheets/d/…
    • 再次感谢您的时间和 cmets。这一切都有助于我的学习:)