我正在Google工作表中使用Google脚本的这一部分来解析网页中的表格并存储结果:
var doc = XmlService.parse(result);
var html = doc.getRootElement();
var resulttable = getElementsByClassName(html, 'resulttable')[0];
var descendants = html.getDescendants();
descendants.push(html);
for(var i in descendants) {
var elt = descendants[i].asElement(); <== it crashes
if(elt != null) {
var test = elt.getAttributes();
var test_bis = elt.getAttribute('http-equiv'); <== it does not crashes: 'http-equiv' exists
var classes = elt.getAttribute('class'); <== it crashes:'class' does not exists
}
}
如图所示,在这段代码的标记行中有一些错误(简称为“服务器错误”)。我还放置了try-catch块,但它们没有捕获错误:脚本突然终止。我如何捕获错误,以便尽管出现这些xml错误,也让脚本继续运行?我的期望是当asElement()或getAttribute()方法失败时具有未定义的元素。
先谢谢您。
P.S。我根据注释中的要求编辑了问题,并添加了html页面的来源。要解析我正在使用this approach
的网址 var url = "https://albopretorio.comune.gravina.ba.it/fo/?ente=GravinaInPuglia";
var today = Utilities.formatDate(new Date(), "GMT+1", "dd/MM/yyyy");
var payload =
{
"tipoSubmit":"ricerca",
"enti":"GravinaInPuglia",
"uo":"",
"tipoatto":"",
"anno":"",
"numda":"",
"numa":"",
"annoatto":"",
"numatto":"",
"datada":"",
"dataa":"",
"pubblicatoda":today,
"pubblicatoa":"",
"presenteal":"",
"chiave":"",
"provenienza":"",
};
var options =
{
"method" : "POST",
"payload" : payload,
"followRedirects" : true,
"muteHttpExceptions": true
};
var result = UrlFetchApp.fetch(url, options);
您不知道每个ContentType是哪个descendant
,所以您不知道应该使用哪种方法来投射节点。
对于每个descendant
,使用方法ContentType
检查相应的getType()。您可以使用返回的值(ContentType
)和switch statement来使用一种或另一种方法。
for (var i in descendants) {
var contentType = descendants[i].getType();
var elt;
switch (contentType.toString()) {
case 'TEXT':
elt = descendants[i].asText();
break;
case 'ELEMENT':
elt = descedants[i].asElement();
break;
// Add other possible ContentTypes, if necessary
为了避免脚本尝试检索不存在的属性,您可以检索该元素的属性名称的数组,然后检查该数组中是否包含您的属性:
var attributes = elt.getAttributes().map(attribute => attribute.getName());
if (attributes.includes('class')) {
var classes = elt.getAttribute('class');
}