【问题标题】:another IMPORTXML returning empty content另一个 IMPORTXML 返回空内容
【发布时间】:2019-09-22 13:07:39
【问题描述】:

当我输入时

=IMPORTXML("http://www.ilgiornale.it/autore/franco-battaglia.html","//h2")

在我的谷歌表格中,我得到:#N/A Imported content is empty

但是,当我输入时:

=IMPORTXML("http://www.ilgiornale.it/autore/franco-battaglia.html","*")

我得到了一些内容,所以我可以假设对页面的访问没有被阻止。

毫无疑问,该页面包含多个h2标签。

那么问题是什么?

【问题讨论】:

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


    【解决方案1】:
    • 您想知道以下情况的原因。
      • =IMPORTXML("http://www.ilgiornale.it/autore/franco-battaglia.html","//h2") 返回#N/A Imported content is empty
      • =IMPORTXML("http://www.ilgiornale.it/autore/franco-battaglia.html","*") 返回内容。

    如果我的理解是正确的,那么这个答案呢?

    问题:

    当我看到http://www.ilgiornale.it/autore/franco-battaglia.html的HTML数据时,我注意到它的错误点。如下。

    window.jQuery || document.write("<script src='/sites/all/modules/jquery_update/replace/jquery/jquery.min.js'>\x3C/script>")
    

    在这种情况下,脚本标签不会像\x3C/script&gt; 那样关闭。似乎当 IMPORTXML 检索到这一行时,脚本选项卡没有关闭。我可以确认,当\x3C 转换为&lt; 时,=IMPORTXML("http://www.ilgiornale.it/autore/franco-battaglia.html","//h2") 正确返回了h2 标签的值。

    由此看来,=IMPORTXML("http://www.ilgiornale.it/autore/franco-battaglia.html","//h2") 返回#N/A Imported content is empty 的问题出现了。

    关于=IMPORTXML("http://www.ilgiornale.it/autore/franco-battaglia.html","*")返回内容的原因,我放这个公式的时候,找不到脚本选项卡的值。从这种情况来看,我认为脚本标签可能有问题。所以我可以找到上面的错误点。我可以确认,当\x3C 转换为&lt; 时,=IMPORTXML("http://www.ilgiornale.it/autore/franco-battaglia.html","*") 返回的值包括脚本标签的值。

    解决方法:

    为了避免上述问题,需要将\x3C修改为&lt;。那么下面的解决方法呢?在这些变通方法中,我使用了 Google Apps 脚本。请将这些解决方法视为几种解决方法中的两种。

    模式一:

    在这个模式中,首先从 URL 下载 HTML 数据,并修改错误点。然后,将修改后的 HTML 数据创建为文件,并共享该文件。并检索文件的 URL。使用此 URL 检索值。

    示例脚本:
    function myFunction() {
      var url = "http://www.ilgiornale.it/autore/franco-battaglia.html";
      var data = UrlFetchApp.fetch(url).getContentText().replace(/\\x3C/g, "<");
      var file = DriveApp.createFile("htmlData.html", data, MimeType.HTML);
      file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
      var endpoint = "https://drive.google.com/uc?id=" + file.getId() + "&export=download";
      Logger.log(endpoint)
    }
    
    • 使用此脚本时,首先请运行myFunction() 的函数并检索端点。作为测试用例,请将端点放在单元格“A1”。并将=IMPORTXML(A1,"//h2") 放入单元格“A2”。这样,可以检索值。

    模式2:

    在此模式中,标签h2 的值通过解析HTML 数据直接检索,并将它们放入活动的电子表格中。

    示例脚本:
    function myFunction() {
      var url = "http://www.ilgiornale.it/autore/franco-battaglia.html";
      var data = UrlFetchApp.fetch(url).getContentText().match(/<h2[\s\S]+?<\/h2>/g);
      var xml = XmlService.parse("<temp>" + data.join("") + "</temp>");
      var h2Values = xml.getRootElement().getChildren("h2").map(function(e) {return [e.getValue()]});
      var sheet = SpreadsheetApp.getActiveSheet();
      sheet.getRange(sheet.getLastRow() + 1, 1, h2Values.length, 1).setValues(h2Values);
    
      Logger.log(h2Values)
    }
    
    • 当您运行脚本时,标签h2 的值会直接放入活动电子表格中。

    参考资料:

    如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

    【讨论】:

    • 一个惊人的答案。非常感谢您抽出时间来找我。无论如何,在谷歌表格/谷歌应用脚​​本上有一个更宽容的 html 解析器应该很好。
    • @tic 感谢您的回复。我很高兴你的问题得到了解决。是的。我认同。而且,我认为如果有一个函数可以直接用于 XML 和 HTML 的值而不是 URL,它将成为更有用和重要的函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 2020-08-11
    相关资源
    最近更新 更多