2015-11-06 35 views
0

我试图在谷歌应用程序脚本解析HTML使用谷歌应用程序脚本

function parse() { 

    var html = UrlFetchApp.fetch('http://www.merriam-webster.com/').getContentText(); 
    var doc = XmlService.parse(html); 
    var html = doc.getRootElement(); 
    var element = getElementsByID(html, 'xx'); 
    return element; 
} 


function getElementById(element, idToFind) { 
    var descendants = element.getDescendants(); 
    for(i in descendants) { 
    var elt = descendants[i].asElement(); 
    if(elt !=null) { 
     var id = elt.getAttribute('id'); 
     if(id !=null && id.getValue()== idToFind) return elt;  
    } 
    } 
} 

使用该脚本来解析HTML,但它说:

第27行错误:元素类型“SCR”绝后面跟着属性规范,“>”或“/>”。 (第4行,文件“”)

我想解析html,然后使用上面的getElementById函数。 有什么想法?

+0

[如何在不使用XmlService的情况下解析Google Apps脚本中的HTML字符串?](https://stackoverflow.com/questions/33893143/how-to-parse-an-html-string-in-谷歌 - 应用程序 - 脚本不-使用-xmlservice) –

回答

1

我发现在谷歌应用中解析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脚本项目。打开脚本编辑器,选择File> New> HTML文件,并将其命名为“test'.Then以下代码复制到你的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文件,返回到您的电子表格。重新加载您的电子表格。点击“解析菜单” - “解析”。然后点击边栏中的“点击此处获取列表”。

0

要分析你必须消毒的HTML,你的页面有一个是用JavaScript写成一个字符串,更具体的脚本标签:

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

XML解析器并不了解Javascript代码,很明显,所以你必须手动清理这一点,并不是一件简单的事情,但是你可以建立一个简单的正则表达式的选择,如:

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。这当然是一个简单的正则表达式,并且在所有情况下都不起作用,但对于其中的大多数来说,它们会表现得很好。

相关问题