另一个返回空内容的 IMPORTXML

another IMPORTXML returning empty content

当我输入

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

在我的 google sheet 中,我得到:#N/A Imported content is empty

然而,当我输入:

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

我得到了一些内容,因此我可以假定对该页面的访问未被阻止。

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

那么问题是什么?

  • 您想了解以下情况的原因。
    • =IMPORTXML("http://www.ilgiornale.it/autore/franco-battaglia.html","//h2") returns #N/A Imported content is empty.
    • =IMPORTXML("http://www.ilgiornale.it/autore/franco-battaglia.html","*")returns内容。

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

问题:

当我看到 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>那样关闭。似乎当 IMPORTXML 检索到这一行时,脚本选项卡并未关闭。我可以确认当 \x3C 转换为 < 时,=IMPORTXML("http://www.ilgiornale.it/autore/franco-battaglia.html","//h2") 正确 returns h2 标签的值。

由此看来,=IMPORTXML("http://www.ilgiornale.it/autore/franco-battaglia.html","//h2") returns #N/A Imported content is empty 的问题似乎发生了。

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

解决方法:

为避免上述问题,需要将\x3C修改为<。那么以下解决方法如何?在这些解决方法中,我使用了 Google Apps 脚本。请将这些解决方法视为几种解决方法中的两种。

模式 1:

在这个模式中,首先从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"。通过这个,可以检索值。

模式二:

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

示例脚本:
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 的值直接放入活动电子表格。

参考文献:

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