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完全从谷歌删除脚本.
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,然后单击“添加”。选择最高版本号,然后单击“保存”。
在 2021 年,.gs我所知道的在这方面解析 HTML 的最佳方法是……
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 文件并返回到您的电子表格。重新加载您的电子表格。单击“解析菜单”-“解析”。然后单击侧栏中的“单击此处获取列表”。
| 归档时间: |
|
| 查看次数: |
17270 次 |
| 最近记录: |