Не в состоянии очистить данные - PullRequest
0 голосов
/ 27 октября 2018

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

На моем листе, используя приведенную ниже формулу, возвращается таблица данных.это именно то, что я ищу из ГАЗА.

=IMPORTHTML("https://finance.yahoo.com/quote/BOO.L/history?p=BOO.L", "table", 1)

Два вопроса здесь & здесь похожи, но попытка этих методов также не дает результатов.Похоже, что я не получаю полный контент страницы, так как при просмотре данных в Logger.log () после кода ниже я не получаю ничего похожего на нужную мне страницу.

UrlFetchApp.fetch(url).getContentText();

С момента запускаформула, кажется, дает данные совершенно, я могу только предположить проблемы с моим собственным кодом, но не могу понять где.Вот код, который я пробовал до сих пор:

function scrapeData() {
var url = "https://finance.yahoo.com/quote/BARC.L/history?p=BARC.L";
var fromText = '<td class="Py(10px) Ta(start) Pend(10px)"><span>';
var toText = '</span></td>';
var content = UrlFetchApp.fetch(url).getContentText();
var scraped = Parser
          .data(content)
          .from(fromText)
          .to(toText)
          .iterate();

Logger.log(scraped)
}

Любое руководство высоко ценится.

1 Ответ

0 голосов
/ 29 октября 2018
  • Вы хотите получить и поместить значения из URL в электронную таблицу, используя скрипт Google Apps.

Если мое понимание верно, как насчет этой модификации? Я думаю, что есть несколько ответов для вашей ситуации. Поэтому, пожалуйста, подумайте об этом как об одном из них.

Очки модификации:

  • Для извлечения таблицы я использовал Parser и XmlService.
    1. Получить таблицу как строковое значение, используя Parser.
    2. Разобрать таблицу, используя XmlService. Я думаю, что XmlService позволяет нам легко разобрать таблицу.

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

Модифицированный скрипт:

function scrapeData() {
  // Retrieve table as a string using Parser.
  var url = "https://finance.yahoo.com/quote/BOO.L/history?p=BOO.L";
  // var url = "https://finance.yahoo.com/quote/BARC.L/history?p=BARC.L";
  var fromText = '<div class="Pb(10px) Ovx(a) W(100%)" data-reactid="30">';
  var toText = '<div class="Mstart(30px) Pt(10px)"';
  var content = UrlFetchApp.fetch(url).getContentText();
  var scraped = Parser.data(content).from(fromText).to(toText).build();

  // Parse table using XmlService.
  var root = XmlService.parse(scraped).getRootElement();
  // Retrieve header
  var headerTr = root.getChild("thead").getChildren();
  var res = headerTr.map(function(e) {return e.getChildren().map(function(f) {return f.getValue()})});
  var len = res[0].length;
  // Retrieve values
  var valuesTr = root.getChild("tbody").getChildren();
  var values = valuesTr.map(function(e) {return e.getChildren().map(function(f) {return f.getValue()})})
  .map(function(e) {return e.length == len ? e : e.concat(Array.apply(null, new Array(len - e.length)).map(String.prototype.valueOf,""))});
  Array.prototype.push.apply(res, values);

  // Put the result to the active spreadsheet.
  var ss = SpreadsheetApp.getActiveSheet();
  ss.getRange(1, 1, res.length, res[0].length).setValues(res);
}

Примечание:

  • Перед запуском этого измененного сценария установите библиотеку GAS Parser .
  • В моей среде я мог подтвердить, что модифицированный скрипт работает как для p=BOO.L, так и для p=BARC.L. Я не мог подтвердить других. Поэтому, когда вы попробовали другие, если произошла ошибка, пожалуйста, измените скрипт.

Справка:

Если это не то, что вы хотите, извините.

...