使用Google App Script解析Html

时间:2015-11-06 06:50:14

标签: google-apps-script

我正在尝试使用Google应用脚本中的此脚本解析html

someone
gmail.com

但它说:

  

第27行出错:元素类型" scr"必须遵循属性规范,">"或" />"。 (第4行,文件"")

我正在尝试解析html,然后使用上面的getElementById函数。 任何想法?

2 个答案:

答案 0 :(得分:2)

我发现在Google应用中解析html的最佳方法是避免使用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-点击菜单工具>脚本编辑器...使用代码编辑器窗口打开一个新选项卡,并将以下代码复制到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文件添加到Apps脚本项目中。打开脚本编辑器,然后选择文件&gt;新&gt; 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”。然后点击侧栏中的“点击此处获取列表”。

答案 1 :(得分:0)

要解析HTML,您必须对其进行清理,您的页面有一个脚本标记,该标记使用Javascript作为字符串编写,更具体地说:

document.write('<scr' + 'ipt src="' + src + '"></scr' + 'ipt>');})

显然,XML解析器不理解Javascript代码,所以你必须手动清理它,不是一件简单的事情,你可以构建一个简单的RegEx选择器,如:

function getElementsByID(element, idToFind) {  
  var regId = new RegExp( '(<[^<]*id=[\'"]'+ idToFind +'[\'"][^>]*)' );
  var result = regId.exec( element );
  return result[1] + '>';
}

function parse() {
      var html = UrlFetchApp.fetch('http://www.merriam-webster.com/').getContentText();
      var element = getElementsByID(html, 'search_box_terms');
      return element; // "<input id="search_box_terms" name="query" type="text" placeholder="I'm searching for ..." value="" />"

    }

这将返回您提供的ID元素的字符串。这当然是一个简单的RegEx,并不适用于所有情况,但对大多数情况都会很好。