在谷歌应用脚​​本中解析html的最佳方法是什么?

cop*_*ead 16 html javascript regex google-apps-script

var page = UrlFetchApp.fetch(contestURL);
var doc = XmlService.parse(page);
Run Code Online (Sandbox Code Playgroud)

上面的代码在使用时给出了解析错误,但是如果我将XmlService类替换为已弃用的Xml类,并且设置了lenient标志,则它会正确解析html.

var page = UrlFetchApp.fetch(contestURL);
var doc = Xml.parse(page, true);
Run Code Online (Sandbox Code Playgroud)

问题主要是因为html的javascript部分没有CDATA而且解析器抱怨以下错误.

The entity name must immediately follow the '&' in the entity reference.
Run Code Online (Sandbox Code Playgroud)

即使我删除所有<script>(.*?)</script>使用正则表达式,它仍然抱怨因为<br>标签没有关闭.是否有一种将html解析为DOM树的简洁方法.

Jus*_*ell 31

我遇到了同样的问题.我可以先使用过时的规避它Xml.parse,因为它仍然有效,然后选择身体的XmlElement,然后在其XML字符串传递到新的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();
Run Code Online (Sandbox Code Playgroud)

注意:如果旧的该解决方案可能无法Xml.parse完全从谷歌删除脚本.

  • 2020 年注意事项:Xml.parse 确实已被删除。 (6认同)
  • 感谢这个技巧:)它仍然有效,截至2016年1月. (5认同)
  • 它很棒,因为它允许您使用记录良好的XmlService,否则它将无法使用,因为它在解析HTML文件时遇到问题.如果有人想知道如何选择元素,这将有所帮助:https://sites.google.com/site/scriptsexamples/learn-by-example/parsing-html(对不起新的提交,编辑为时已晚) ..) (3认同)
  • doc.html.body由于某种原因是我的数组,每个元素似乎都不同 (2认同)

Mow*_*zer 13

自 2020 年 5 月起,您现在可以使用Google Apps 脚本的 Cheerio 库来执行此操作。

返回维基百科主页的内容

const content = getContent_('https://en.wikipedia.org');
const $ = Cheerio.load(content);
Logger.log($('#mp-right').text());
Run Code Online (Sandbox Code Playgroud)

<p>返回维基百科主页第一段的内容

const content = getContent_('https://en.wikipedia.org');
const $ = Cheerio.load(content);
Logger.log($('p').first().text());
Run Code Online (Sandbox Code Playgroud)

要添加到您的项目:

Resources - Libraries...在 Google Apps 脚本编辑器中选择。1ReeQ6WO8kKNxoaA_O0XEQ589cIrRvEBA9qcWpNqdOP17i47u6N9M5Xh0在字段中输入项目密钥Add a library,然后单击“添加”。选择最高版本号,然后单击“保存”。


thd*_*oan 9

在 2021 年,.gs我所知道的在这方面解析 HTML 的最佳方法是……

  1. 单击库旁边的 +
  2. 输入 1ReeQ6WO8kKNxoaA_O0XEQ589cIrRvEBA9qcWpNqdOP17i47u6N9M5Xh0
  3. 点击“查找”
  4. 点击添加
  5. 示例用法:
const contentText = UrlFetchApp.fetch('https://www.somesite.com/').getContentText();
const $ = Cheerio.load(contentText);

$('.some-class').first().text();
Run Code Online (Sandbox Code Playgroud)

就是这样——这可能是我们最接近在 GAS 中进行类似 jQuery 的 DOM 选择的方法。该.first()是很重要的,否则你可以提取更多的内容比你预期的(认为它是使用querySelector()代替querySelectorAll())。

信用到期的信用:https : //github.com/tani/cheeriogs


小智 5

我发现在 google 应用程序中解析 html 的最佳方法是避免使用 XmlService.parse 或 Xml.parse。XmlService.parse 不适用于某些网站的错误 html 代码。

这里有一个基本示例,说明如何在不使用 XmlService.parse 或 Xml.parse 的情况下轻松解析任何网站。在此示例中,我从“wikipedia.org/wiki/President_of_the_United_States”中检索总统列表,并使用常规 javascript document.getElementsByTagName(),并将这些值粘贴到我的谷歌电子表格中。

1- 创建一个新的 Google Sheet;

2- 单击菜单工具 > 脚本编辑器...以打开带有代码编辑器窗口的新选项卡,并将以下代码复制到您的 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
    }
}
Run Code Online (Sandbox Code Playgroud)

3- 将 HTML 文件添加到您的 Apps 脚本项目。打开脚本编辑器并选择 File > New > Html File,并将其命名为“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>
Run Code Online (Sandbox Code Playgroud)

4- 保存您的 gs 和 html 文件并返回到您的电子表格。重新加载您的电子表格。单击“解析菜单”-“解析”。然后单击侧栏中的“单击此处获取列表”。


Zig*_*del 1

本质上没有办法,除非你做了你已经尝试过的事情,如果 html 不符合 xml 格式,这将不起作用。