Каков наилучший способ разобрать 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.