другой IMPORTXML, возвращающий пустое содержимое - PullRequest
1 голос
/ 22 сентября 2019

Когда я ввожу

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

в своем листе Google, я получаю: #N/A Imported content is empty.

Однако, когда я ввожу:

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

, я получаюнекоторый контент, поэтому я могу предположить, что доступ к странице не заблокирован.

И страница содержит несколько h2 тегов без каких-либо сомнений.

Так в чем же проблема?

1 Ответ

1 голос
/ 23 сентября 2019

Если мое понимание верно, как насчетэтот ответ?

Проблема:

Когда я увидел данные HTML http://www.ilgiornale.it/autore/franco-battaglia.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") правильно возвращает значения тега 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","*") возвращает содержимое, когда я поместил эту формулу, я не смог найти значения на вкладке сценария.Из этой ситуации я подумал, что у тега script может быть проблема.Таким образом, я мог найти вышеупомянутую неправильную точку.Я мог бы подтвердить, что когда \x3C преобразуется в <, =IMPORTXML("http://www.ilgiornale.it/autore/franco-battaglia.html","*") возвращает значения, включая значения тега сценария.

Обходные пути:

Чтобы избежать вышеуказанной проблемы,требуется изменить \x3C на <.Так как насчет следующих обходных путей?В этих обходных путях я использовал Google Apps Script.Пожалуйста, подумайте об этих обходных путях как о двух из нескольких обходных путей.

Шаблон 1:

В этом шаблоне сначала загрузите данные HTML с URL-адреса и измените неправильную точку.Затем измененные данные 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") в ячейку "А2".Посредством этого можно извлечь значения.

Шаблон 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 напрямую помещаются в активную электронную таблицу.

Список литературы:

Если я неправильно понял ваш вопрос, и это былоне то направление, которое вы хотите, прошу прощения.

...