Как разобрать строку HTML в скрипте Google Apps без использования XmlService?

я хочу создать скребок с помощью электронных таблиц Google с помощью скрипта Google Apps. Я знаю, что это возможно, и я видел некоторые учебники и темы про это.

основная идея заключается в использовании:

  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 синтаксический анализ таблицы из messed html и каков наилучший способ анализа html в приложениях google скрипт что можно использовать устаревший метод, называемый xml.parse() который принимает второй параметр, который позволяет анализировать HTML. Однако, как я уже упоминал, он устарел, и я не могу найти никакой документации по нему нигде. The xml.parse() кажется, анализирует строку, но у меня проблемы с работой с элементами из-за отсутствия документации. И это также не самое безопасное долгосрочное решение, потому что его можно отключить в ближайшее время.

Итак, я хочу знать, как я могу разобрать этот HTML в Google Apps скрипт?

я тоже пробовал:

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, но я не мог найти ни одного.

моя конечная цель-получить некоторую информацию из набора страниц, таких как цена, ссылка, название продуктов и т. д. Мне удалось сделать это, используя серию Регулярное выражение:

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(/(rn|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 и легко получить доступ к его элементам. Его на самом деле не добавить. но простой скрипт приложения google..

6 ответов


Я сделал это в vanilla js. Не настоящий синтаксический анализ html. Просто попробуйте получить некоторое содержимое из строки (url):

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

Это обсуждалось ранее. Смотрите здесь: каков наилучший способ синтаксического анализа html в Google apps script

в отличие от XML услуги XMLService не очень прощает уродливый html. Трюк в ответе Джастина Бикнелла делает свою работу. Хотя XML сервис устарел, он все еще продолжает работать.


Я сделал cheeriogs для вашей проблемы. это работает на газе как cheerio, который является jQuery-подобным api. Ты можешь сделать это вот так.

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

Смотрите также https://github.com/asciian/cheeriogs


не могли бы вы используйте javascript для разбора html? Если ваш скрипт Google Apps извлек html в виде строки, а затем вернул его в функцию javascript, похоже, вы можете проанализировать его за пределами скрипта Google Apps. Любые теги, которые вы хотите очистить, Вы можете отправить в специальную функцию Google Apps, которая сохранит контент.

вы могли бы сделать это более легко С помощью jQuery.


имейте в виду, что некоторые веб-сайты не могут разрешить автоматическую очистку их содержимого, поэтому, пожалуйста, ознакомьтесь с их условиями или услугами перед использованием скрипта приложений для извлечения содержимого.

на XmlService работает только с допустимыми XML-документами, и большинство HTML (особенно HTML5), не является допустимым XML. Предыдущая версия XmlService, просто позвонил Xml, разрешенный для" мягкого " синтаксического анализа, что позволит ему также анализировать HTML. Эта услуга была sunset в 2013 году, но на время бытие все еще функционирует. Справочные документы больше не доступны, но это старый учебник показывает его использование.

Другой альтернативой является использование службы, как кимоно, который обрабатывает части выскабливания и разбора и предоставляет простой API, который вы можете вызвать через UrlFetchApp для извлечения структурированных данных.


Ive нашел очень аккуратную альтернативу scrape с помощью Google App Script. Она называется PhantomJS Облако. Можно использовать urlFetchApp для доступа к API. Это позволяет выполнять код Jquery на страницах, что делает жизнь намного проще.