wake-up-neo.net

Wie kann ich einen HTML-String in Google Apps Script parsen, ohne XmlService zu verwenden?

Ich möchte einen Scraper mit Google Spreadsheets mit Google Apps Script erstellen. Ich weiß, dass es möglich ist, und ich habe einige Tutorials und Threads darüber gesehen.

Die Hauptidee ist zu verwenden:

  var html = UrlFetchApp.fetch('http://en.wikipedia.org/wiki/Document_Object_Model').getContentText();
  var doc = XmlService.parse(html);

Und dann bekommen und arbeiten Sie mit den Elementen. Jedoch die Methode

XmlService.parse()

Funktioniert nicht für einige Seiten. Zum Beispiel, wenn ich versuche:

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);
}

Ich erhalte folgende Fehlermeldung:

Error on line 225: The entity name must immediately follow the '&' in the entity reference. (line 3, file "")

Ich habe versucht, string.replace() zu verwenden, um die Zeichen zu entfernen, die den Fehler anscheinend verursachen, aber es funktioniert nicht. Alle anderen Fehler werden angezeigt. Der folgende Code zum Beispiel:

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);
}

Gibt mir den folgenden Fehler:

Error on line 358: The content of elements must consist of well-formed character data or markup. (line 6, file "")

Ich glaube, das ist ein Problem mit der XmlService.parse()-Methode.

Ich habe in diesen Threads gelesen:

Google App Script parse table von messed html und Was ist der beste Weg, um HTML in google apps script zu parsen dass man eine veraltete Methode namens xml.parse() verwenden kann, die einen zweiten Parameter akzeptiert, der das Analysieren von HTML erlaubt? Wie ich bereits erwähnt habe, ist es jedoch veraltet und ich kann nirgendwo Dokumentation finden. Die xml.parse() scheint den String zu parsen, aber ich habe Schwierigkeiten mit den Elementen zu arbeiten, da keine Dokumentation vorhanden ist. Und es ist auch nicht die langfristig sichere Lösung, da sie jederzeit deaktiviert werden kann.

Ich möchte also wissen, wie ich diesen HTML-Code in Google Apps Script parse?

Ich habe auch versucht:

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);
}

Aber es funktioniert nicht, ich bekomme diesen Fehler:

Fehlerhafter HTML-Inhalt:

Ich dachte darüber nach, eine Open-Source-Bibliothek zu verwenden, um den HTML-Code zu analysieren, konnte aber keine finden.

Mein ultimatives Ziel ist es, einige Informationen von einer Reihe von Seiten wie Preis, Link, Name der Produkte usw. zu erhalten. Ich habe es geschafft, dies mit einer Reihe von RegEx zu tun:

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;
}

Dies ist jedoch sehr zeitaufwendig für die Programmierung, es ist sehr schwierig, es dynamisch zu ändern und ist nicht sehr zuverlässig.

Ich brauche einen Weg, um diesen HTML-Code zu analysieren und leicht auf seine Elemente zuzugreifen ... Es ist eigentlich kein Add-On. aber ein einfaches google app script ..

12
user3347814

Ich habe das in Vanilla Js gemacht. Nicht echtes HTML-Parsing. Versuchen Sie einfach, einen Inhalt aus einem String (URL) herauszuholen:

function getLKKBTC() {
  var url = 'https://www.lykke.com/exchange';
  var html = UrlFetchApp.fetch(url).getContentText();
  var searchstring = '<td class="ask_BTCLKK">';
  var index = html.search(searchstring);
  if (index >= 0) {
    var pos = index + searchstring.length
    var rate = html.substring(pos, pos + 6);
    rate = parseFloat(rate)
    rate = 1/rate
    return parseFloat(rate);
  }
  throw "Failed to fetch/parse data from " + url;
}
8
Fabian Thommen

Dies wurde zuvor diskutiert. Siehe hier: Was ist der beste Weg, um HTML in Google Apps Skript zu parsen

Im Gegensatz zu XML ist der XMLService fehlerhaften HTML-Code nicht nachsichtig. Der Trick in der Antwort von Justin Bicknell macht den Job. Obwohl der Dienst XML veraltet ist, funktioniert er weiterhin. 

5
Sujay Phadke

Ich habe Cheeriogs für dein Problem gemacht. es funktioniert auf GAS als Cheerio, das jQuery-artige API ist. Das kannst du so machen.

const content = UrlFetchApp.fetch('https://example.co/').getContentText();
const $ = Cheerio.load(content);
Logger.log($('p .blah').fist().text()); // blah blah blah ...

Siehe auch https://github.com/asciian/cheeriogs

4
asciian

Bitte beachten Sie, dass bestimmte Websites möglicherweise ein automatisiertes Scraping des Inhalts nicht zulassen. Konsultieren Sie daher bitte deren Bedingungen oder Dienste, bevor Sie mit Apps Script den Inhalt extrahieren.

Die Variable XmlService arbeitet nur mit gültigen XML-Dokumenten, und die meisten HTML-Dateien (insbesondere HTML5) sind kein gültiges XML. Eine frühere Version von XmlService, einfach als Xml bezeichnet, ermöglichte eine "mildere" Analyse, wodurch auch HTML analysiert werden konnte. Dieser Service wurde 2013 eingestellt, funktioniert aber vorerst noch. Die Referenzdokumente sind nicht mehr verfügbar, aber diese alte Anleitung zeigt ihre Verwendung.

Eine andere Alternative ist die Verwendung eines Dienstes wie Kimono , der die Scraping- und Parsing-Teile behandelt und eine einfache API bietet, die Sie über UrlFetchApp aufrufen können, um die strukturierten Daten abzurufen.

2
Eric Koleda

Könnten Sie mit Javascript das HTML analysieren? Wenn Ihr Google Apps-Skript die HTML-Datei als Zeichenfolge abgerufen und dann an eine JavaScript-Funktion zurückgegeben hat, können Sie sie anscheinend problemlos außerhalb des Google Apps-Skripts analysieren. Alle Tags, die Sie entfernen möchten, können Sie an eine spezielle Google Apps-Funktion senden, mit der der Inhalt gespeichert wird.

Sie könnten dies wahrscheinlich leichter erreichen mit jQuery .

0
Eric Dauenhauer

Ich habe eine sehr ordentliche Alternative zum Scraphen mit Google App Script gefunden. Es heißt PhantomJS Cloud . Man kann die urlFetchApp verwenden, um auf die API zuzugreifen. Dies ermöglicht die Ausführung von Jquery-Code auf den Seiten, was das Leben so viel einfacher macht.

0
user3347814

vielleicht nicht der sauberste Ansatz, aber die einfache Stringverarbeitung erledigt den Job auch ohne xmlservice:

var url = 'https://somewebsite.com/?q=00:11:22:33:44:55';
var html = UrlFetchApp.fetch(url).getContentText();
// we want only the link text displayed from here:
//<td><a href="/company/ubiquiti-networks-inc">Ubiquiti Networks Inc.</a></td>
var string1 = html.split('<td><a href="/company/')[1]; // all after '<td><a href="/company/'
var string2 = string1.split('</a></td>')[0];           // all before '</a></td>'
var string3 = string2.split('>')[1];                   // all after '>'
Logger.log('link text: '+string3);                     // string3 => "Ubiquiti Networks Inc."
0
vchrizz