【发布时间】:2016-02-26 20:43:57
【问题描述】:
我想使用带有 Google Apps 脚本的 Google 电子表格创建一个抓取工具。我知道这是可能的,并且我已经看过一些关于它的教程和线程。
主要思想是使用:
var html = UrlFetchApp.fetch('http://en.wikipedia.org/wiki/Document_Object_Model').getContentText();
var doc = XmlService.parse(html);
然后获取并使用这些元素。但是,方法
XmlService.parse()
不适用于某些页面。例如,如果我尝试:
function test(){
var html = UrlFetchApp.fetch("https://www.nespresso.com/br/pt/product/maquina-de-cafe-espresso-pixie-clips-preto-lima-neon-c60-220v").getContentText();
var parse = XmlService.parse(html);
}
我收到以下错误:
Error on line 225: The entity name must immediately follow the '&' in the entity reference. (line 3, file "")
我尝试使用string.replace() 来消除明显导致错误的字符,但它不起作用。出现各种其他错误。以如下代码为例:
function test(){
var html = UrlFetchApp.fetch("https://www.nespresso.com/br/pt/product/maquina-de-cafe-espresso-pixie-clips-preto-lima-neon-c60-220v").getContentText();
var regExp = new RegExp("&", "gi");
html = html.replace(regExp,"");
var parse = XmlService.parse(html);
}
给我以下错误:
Error on line 358: The content of elements must consist of well-formed character data or markup. (line 6, file "")
我认为这是XmlService.parse() 方法的问题。
我读过这个帖子:
Google App Script parse table from messed html 和What is the best way to parse html in google apps script 可以使用一种已弃用的名为xml.parse() 的方法,它接受允许解析HTML 的第二个参数。但是,正如我所提到的,它已被弃用,我在任何地方都找不到任何文档。 xml.parse() 似乎可以解析字符串,但由于缺少文档,我无法处理这些元素。而且它也不是最安全的长期解决方案,因为它可能很快就会被停用。
那么,我想知道如何在 Google Apps 脚本中解析这个 HTML?
我也试过了:
function test(){
var html = UrlFetchApp.fetch("https://www.nespresso.com/br/pt/product/maquina-de-cafe-espresso-pixie-clips-preto-lima-neon-c60-220v").getContentText();
var htmlOutput = HtmlService.createHtmlOutput(html).getContent();
var parse = XmlService.parse(htmlOutput);
}
但它不起作用,我收到此错误:
格式错误的 HTML 内容:
我想过使用开源库来解析 HTML,但我找不到。
我的最终目标是从一组页面中获取一些信息,例如价格、链接、产品名称等。我已经设法使用一系列 RegEx 来做到这一点:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var linksSheet = ss.getSheetByName("Links");
var resultadosSheet = ss.getSheetByName("Resultados");
function scrapyLoco(){
var links = linksSheet.getRange(1, 1, linksSheet.getLastRow(), 1).getValues();
var arrayGrandao = [];
for (var row = 0, len = links.length; row < len; row++){
var link = links[row];
var arrayDeResultados = pegarAsCoisas(link[0]);
Logger.log(arrayDeResultados);
arrayGrandao.push(arrayDeResultados);
}
resultadosSheet.getRange(2, 1, arrayGrandao.length, arrayGrandao[0].length).setValues(arrayGrandao);
}
function pegarAsCoisas(linkDoProduto) {
var resultadoArray = [];
var html = UrlFetchApp.fetch(linkDoProduto).getContentText();
var regExp = new RegExp("<h1([^]*)h1>", "gi");
var h1Html = regExp.exec(html);
var h1Parse = XmlService.parse(h1Html[0]);
var h1Output = h1Parse.getRootElement().getText();
h1Output = h1Output.replace(/(\r\n|\n|\r|(^( )*))/gm,"");
regExp = new RegExp("Ref.: ([^(])*", "gi");
var codeHtml = regExp.exec(html);
var codeOutput = codeHtml[0].replace("Ref.: ","").replace(" ","");
regExp = new RegExp("margin-top: 5px; margin-bottom: 5px; padding: 5px; background-color: #699D15; color: #fff; text-align: center;([^]*)/div>", "gi");
var descriptionHtml = regExp.exec(html);
var regExp = new RegExp("<p([^]*)p>", "gi");
var descriptionHtml = regExp.exec(descriptionHtml);
var regExp = new RegExp("^[^.]*", "gi");
var descriptionHtml = regExp.exec(descriptionHtml);
var descriptionOutput = descriptionHtml[0].replace("<p>","");
descriptionOutput = descriptionOutput+".";
regExp = new RegExp("ecom(.+?)Main.png", "gi");
var imageHtml = regExp.exec(html);
var comecoDaURL = "https://www.nespresso.com/";
var imageOutput = comecoDaURL+imageHtml[0];
var regExp = new RegExp("nes_l-float nes_big-price nes_big-price-with-out([^]*)p>", "gi");
var precoHtml = regExp.exec(html);
var regExp = new RegExp("[0-9]*,", "gi");
precoHtml = regExp.exec(precoHtml);
var precoOutput = "BRL "+precoHtml[0].replace(",","");
resultadoArray = [codeOutput,h1Output,descriptionOutput,"Home & Garden > Kitchen & Dining > Kitchen Appliances > Coffee Makers & Espresso Machines",
"Máquina",linkDoProduto,imageOutput,"new","in stock",precoOutput,"","","","Nespresso",codeOutput];
return resultadoArray;
}
但是这样编程非常耗时,很难动态改变,也不是很可靠。
我需要一种方法来解析这个 HTML 并轻松访问它的元素。 其实不是加分项。但是一个简单的谷歌应用脚本..
【问题讨论】:
-
这能回答你的问题吗? Parse HTML string using CSS selectors
标签: javascript parsing google-apps-script google-sheets html-parsing