Каков наилучший способ разобрать html в приложениях google script

var page = UrlFetchApp.fetch(contestURL);
var doc = XmlService.parse(page);

Приведенный выше код дает ошибку анализа при использовании, однако, если я заменю класс XmlService на устаревший класс Xml, с установленным флагом lenient, он правильно анализирует html.

var page = UrlFetchApp.fetch(contestURL);
var doc = Xml.parse(page, true);

Проблема в основном вызвана отсутствием CDATA в javascript-компоненте html, и парсер жалуется на следующую ошибку.

The entity name must immediately follow the '&' in the entity reference.

Даже если я удалю все <script>(.*?)</script> с помощью регулярного выражения, он все еще жалуется, потому что теги <br> не закрыты. Есть ли чистый способ разбора html в дереве DOM.

Ответ 1

Я столкнулся с этой же проблемой. Я смог обойти его, сначала используя устаревший Xml.parse, так как он все еще работает, затем выбирая тело XmlElement, а затем передавая его Xml String в новый метод XmlService.parse:

var page = UrlFetchApp.fetch(contestURL);
var doc = Xml.parse(page, true);
var bodyHtml = doc.html.body.toXmlString();
doc = XmlService.parse(bodyHtml);
var root = doc.getRootElement();

Примечание. Это решение может не работать, если старый Xml.parse полностью удален из скриптов Google.

Ответ 2

Xml.parse() имеет возможность включить мягкий синтаксический анализ, который помогает при анализе HTML. Обратите внимание, что служба Xml устарела, но новая XmlService не имеет этой функции.

Ответ 3

Используйте регулярное выражение:

var page = UrlFetchApp.fetch(contestURL);
var regExp = new RegExp("(pattern)", "gi");
var value = regExp.exec(page.getContentText())[1];   // [1] is the match group when using parenthesis in the pattern

Ответ 4

Я обнаружил, что лучший способ разбора html в google-приложениях - избегать использования XmlService.parse или Xml.parse. XmlService.parse не работает с плохой HTML-код с определенных сайтов.

Вот базовый пример того, как вы можете легко анализировать любой сайт без использования XmlService.parse или Xml.parse. В этом примере я получаю список президентов от "wikipedia.org/wiki/President_of_the_United_States", с обычным javascript document.getElementsByTagName() и вставкой значений в мою электронную таблицу google.

1- Создать новый лист Google

2- Щелкните меню Tools > Script editor..., чтобы открыть новую вкладку с окном редактора кода и скопируйте следующий код в код Code.gs:

function onOpen() {
 var ui = SpreadsheetApp.getUi();
    ui.createMenu("Parse Menu")
      .addItem("Parse", "parserMenuItem")
      .addToUi();

}


function parserMenuItem() {
  var sideBar = HtmlService.createHtmlOutputFromFile("test");
  SpreadsheetApp.getUi().showSidebar(sideBar);
}


function getUrlData(url) {
 var doc = UrlFetchApp.fetch(url).getContentText()
 return doc                               
}

function writeToSpreadSheet(data) {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheets()[0];
 var row=1

   for (var i = 0; i < data.length; i++) {
   var x = data[i];
   var range = sheet.getRange(row, 1)
   range.setValue(x);
   var row = row+1
    }
}

3- Добавьте файл HTML в ваш проект Script. Откройте редактор Script и выберите "Файл" > "Создать" > "Файл HTML" и назовите его "test". Затем скопируйте следующий код в свой файл test.html

<!DOCTYPE html>
<html>
<head>    
</head>
<body>
<input id= "mButon" type="button" value="Click here to get list"
onclick="parse()">
<div hidden id="mOutput"></div>
</body>
<script>

window.onload = onOpen;

function onOpen() {
 var url = "https://en.wikipedia.org/wiki/President_of_the_United_States"
 google.script.run.withSuccessHandler(writeHtmlOutput).getUrlData(url)
 document.getElementById("mButon").style.visibility = "visible";
}

function writeHtmlOutput(x) {
 document.getElementById('mOutput').innerHTML = x;
}

function parse() {

var list = document.getElementsByTagName("area");
var data = [];

   for (var i = 0; i < list.length; i++) {
   var x = list[i];
   data.push(x.getAttribute("title"))
    }

google.script.run.writeToSpreadSheet(data);
} 
</script> 
</html>

4- Сохраните ваши gs и html файлы и вернитесь к своей электронной таблице. Перезагрузите таблицу. Нажмите "Parse Menu" - "Parse". Затем нажмите "Нажмите здесь, чтобы получить список" на боковой панели.

Ответ 5

Натурально нет способа, если вы не будете делать то, что уже пробовали, что не работает, если html не соответствует формату xml.