【问题标题】:Parsing data google sheets (javascript) using Xpath or RegExp使用 Xpath 或 RegExp 解析数据 google sheet (javascript)
【发布时间】:2020-06-05 13:38:29
【问题描述】:

我正在尝试从以下website (https://www.fundsquare.net/security/information?idInstr=275136) 解析数据

我想在 Google 表格中显示基金的价格。但是,当使用“importxml”函数时,我收到“导入的内容为空”的错误。有人知道我能做些什么来修复它吗?

我尝试该功能的方式:

=IMPORTXML("https://www.fundsquare.net/security/summary?idInstr=275136" ,"//*[@class ='surligneorange']" )

=IMPORTXML("https://www.fundsquare.net/security/information?idInstr=275136" , "//*[@id='content']/table[2]/tbody/tr/td[3]/span[1]")

=IMPORTXML("https://www.fundsquare.net/security/information?idInstr=275136" , "//*[@id='content']//span[1]")

我不断收到同样的错误。在寻找这个错误时,我得到了静态数据和动态数据之间的区别。这个数据会发生变化,所以我猜它是动态的,但我不确定这会如何影响公式。

我一直在尝试使用脚本编辑器做一些事情,但没有成功。还尝试使用 RegExp 进行一些操作,但除了示例之外没有任何其他内容。我对抓取的了解有限,因此非常感谢尝试解析数据时的任何提示和技巧! 任何帮助将不胜感激!

编辑: 在脚本编辑器中,我尝试了以下代码:

function importdata() {
  var found, html, content = '';
  var response = UrlFetchApp.fetch("https://www.fundsquare.net/security/information?idInstr=275136");

  if (response) {
    html = response.getContentText();
    if (html) content = html.match(/<span class="surligneorange">(.*)<\/span>/)[0];
  }
   Logger.log(content);
}

这给了我以下日志输出:

[20-06-05 07:44:58:529 PDT] <span class="surligneorange">31.15&nbsp;EUR</span>&nbsp;<span style="color:#DD0000;text-align:left;padding:4px 0;"> -0.67 &nbsp;%&nbsp;<img src="/images/share/variationNegative.gif" style="vertical-align:middle;"/></span></td></tr></table><div id="onglet"><a  href="/security/documents?idInstr=275136">Documents</a><a  href="/security/eusd?idInstr=275136">Taxes</a><a  href="/security/histo-divid?idInstr=275136">Dividends</a><a  href="/security/histo-prices?idInstr=275136">Hist. Prices</a><a  href="/security/price?idInstr=275136">Price</a><a  href="/security/order-ref-data?idInstr=275136">Order Ref. Data</a><a class="selected" href="/security/information?idInstr=275136">Security Information</a><a  href="/security/summary?idInstr=275136">Overview</a><br class="clear_r"/></div><div id="blocresume"><table class="portlet100pct" border="0" cellspacing="0" cellpadding="0"><tr><td valign="top"  class="portletleft50pct"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td valign="top" class="portletBordGris"><div style="position: relative; left: 1px;" class="bloctitle"><img src="/Fundsquare/images/share/x.gif" border="0" height="1" width="1" /></div><DIV class="bloctitle" style="position: relative; top: -21px; right: 1px;"><span style="top: 3px;" >General information</span>

31.15 是我要抓取的值。如何在电子表格中获取此值?

编辑 06/06 10:14: 更多问题

能否请您帮助我了解您所做的更改。我尝试匹配的和你匹配的到底有什么区别。

我的:

if (html) content = html.match(/<span class="surligneorange">(.*)<\/span>/)[0];

你的:

if (html) content = html.match(/<span class="surligneorange">([\d.]*).*?<\/span>/)[1];


and:
if (html) content = html.match(/<span class="surligneorange">([\d.]*).*<\/span>/)[1];

我的[0] 和你的[1] 有什么区别。是您只要求第一个值吗?

我的.*和你的([\d.]*).*[\d.]*).*?有什么区别??? 我对 javascript 的了解不是很好,所以我不确定它的作用。谢谢您的帮助!

【问题讨论】:

    标签: javascript html parsing google-apps-script google-sheets


    【解决方案1】:

    这个答案怎么样?

    不幸的是,当我看到 HTML 和您的公式时,我认为 IMPORTXML 可能无法直接检索到该值。因此,我认为您使用 Google Apps 脚本的方法可用于检索您期望的值。但我认为你的脚本有一些修改点来实现它。在这个答案中,我想提出您的 Google Apps 脚本的修改点。

    在你的情况下,我认为match的方法和正则表达式需要修改。

    修改后的脚本

    当你的脚本被修改时,请进行如下修改。

    从:
    if (html) content = html.match(/<span class="surligneorange">(.*)<\/span>/)[0];
    
    到:
    if (html) content = html.match(/<span class="surligneorange">([\d.]*).*?<\/span>/)[1];
    
    • 在我的测试中,修改后的脚本返回31.15
    • 我觉得&lt;span class="surligneorange"&gt;([\d.]*).*&lt;\/span&gt;也可以用。

    在 Google 电子表格中放入单元格的脚本

    作为在 Google 电子表格中放入单元格的修改脚本,根据您的情况,我认为您可能希望将其用作自定义函数。如果是这样,那么下面的修改脚本怎么样?

    当您的脚本用作自定义函数时,请将函数名称从importdata重命名为其他人。因为importdata已经被用作内置函数了。

    function sample() {
      var found, html, content = '';
      var response = UrlFetchApp.fetch("https://www.fundsquare.net/security/information?idInstr=275136");
      if (response) {
        html = response.getContentText();
        if (html) content = html.match(/<span class="surligneorange">([\d.]*).*<\/span>/)[1];
      }
      return content;
    }
    
    • 在这种情况下,当=sample() 被放入单元格时,31.15 的值被放入该单元格。如果要将值作为数字,请将return content修改为return Number(content)

    参考:

    补充:

    对于您的其他问题,我添加了如下答案。

    在您的脚本中,html.match(/&lt;span class="surligneorange"&gt;(.*)&lt;\/span&gt;/)[0]; 返回完整匹配。当您要检索组时,在本例中为html.match(/&lt;span class="surligneorange"&gt;(.*)&lt;\/span&gt;/)[1];。但是,在这个正则表达式中,检索到的值为31.15&amp;nbsp;EUR&lt;/span&gt;.....General information&lt;/span&gt;。我认为您的问题的原因是这个。

    为了检索31.15&amp;nbsp;EUR的值,.*被修改为.*?。这样,匹配的值是从&lt;span class="surligneorange"&gt;31.15&amp;nbsp;EUR&lt;/span&gt;.....General information&lt;/span&gt;&lt;span class="surligneorange"&gt;31.15&amp;nbsp;EUR&lt;/span&gt;

    但在您的目标中,您只想检索31.15。所以我使用了([\d.]*).*。这样,&lt;span class="surligneorange"&gt;31.15&amp;nbsp;EUR&lt;/span&gt;.....General information&lt;/span&gt; 中的31.15 被检索到。当使用([\d.]*).*? 时,检索&lt;span class="surligneorange"&gt;31.15&amp;nbsp;EUR&lt;/span&gt; 中的31.15

    所以,在&lt;span class="surligneorange"&gt;([\d.]*).*?&lt;\/span&gt; 的情况下,&lt;span class="surligneorange"&gt;31.15&amp;nbsp;EUR&lt;/span&gt; 是匹配的。而([\d.]*) 就是31.15

    &lt;span class="surligneorange"&gt;([\d.]*).*&lt;\/span&gt; 的情况下,匹配&lt;span class="surligneorange"&gt;31.15&amp;nbsp;EUR&lt;/span&gt;.....General information&lt;/span&gt;。而([\d.]*)31.15

    参考:

    【讨论】:

    • 你是最棒的!感谢您的帮助。已经为此苦苦挣扎了一周,但它终于奏效了! A 添加了几个问题作为回复,希望您仍然可以帮助我!
    • @Mees牟文 谢谢回复。我很高兴你的问题得到了解决。 1.当您添加更多信息时,请将其添加到您的问题中。在您的情况下,该问题作为答案发布。请删除答案并将其添加到您的问题中。 2.关于您的附加问题,我在答案中添加了答案。你能确认一下吗?
    • 感谢您的提示。我是在 Stack Overflow 上发帖的新手,因为我开始自学一些编码和抓取,所以我不知道如何添加信息。谢谢!我的代码目标是从不同的网站和不同的跨度类中检索数据。我将代码调整为带有参数的函数,如我发现的示例中所示,但它给了我错误。你能最后看一下我的代码吗?它添加到问题中!
    • @Mees 牟文谢谢您的回复。但是当我现在看到你的问题时,不幸的是,我认为你添加的问题与你最初的问题不同。在这种情况下,问题被改变了。我的回答是针对您最初的问题。你说You are the best! thank you for the help. been struggling on this for a week but it finally works! 我的回答。关于您与正则表达式相关的其他问题,我在答案中添加了答案。
    • 是的,我知道这对于不同的用户和您来说并不容易理解。我将尝试更清楚地说明问题到底是什么。我已经通过标记您的答案关闭了这篇文章(我认为),并为我的下一个问题打开了一个新问题。就像我说的我是这个平台的新手,非常感谢你解释堆栈溢出的行为准则是​​什么!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多