Парсер ленты Reddit с Google App Script

Вот мой скрипт Google Code.gs:

 /* Reddit Scraper written by Amit Agarwal */



var REDDIT = "HomeImprovement";

function run() {

   deleteTriggers_();

  /* Fetch Reddit posts every 5 minutes to avoid hitting
     the reddit and Google Script quotas */
  ScriptApp.newTrigger("scrapReddit")
           .timeBased().everyMinutes(5).create();
}


function scrapReddit() {

  // Process 20 Reddit posts in a batch
  var url = "http://www.reddit.com/r/"
            + REDDIT + "/new.xml?limit=100" + getLastID_();

  // Reddit API returns the results in XML format
  var response = UrlFetchApp.fetch(url).getContentText();
  var doc = XmlService.parse(response);
  var root = doc.getRootElement();

  var entries = root.getChildren("feed")[0].getChildren("entry");


  var data = new Array();

  for (var i=0; i<entries.length; i++) {

    /* Extract post date, title, description and link from Reddit */

    var date = entries[i].getChild('updated').getText();
    var title = entries[i].getChild('title').getText();
    var desc = entries[i].getChild('content').getText();
    var link = entries[i].getChild('link').getText();

    data[i] = new Array(date, title, desc, link);
  }

  if (data.length == 0) {
    /* There's no data so stop the background trigger */
    deleteTriggers_();
  } else {
    writeData_(data);
  }
}


/* Write the scrapped data in a batch to the
   Google Spreadsheet since this is more efficient */
function writeData_(data) {

  if (data.length === 0) {
    return;
  }

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var row = sheet.getLastRow();
  var col = sheet.getLastColumn();

  var range = sheet.getRange(row+1, 1, data.length, 4);
  try {
    range.setValues(data);
  } catch (e) {
    Logger.log(e.toString());
  }
}

/* Use the ID of the last processed post from Reddit as token */
function getLastID_() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var row = sheet.getLastRow();
  var col = sheet.getLastColumn();

  var url = sheet.getRange(row, col).getValue().toString();
  var pattern = /.*comments\/([^\/]*).*/;
  var id = url.match(pattern);

  return id ? "&after=t3_" + id[1] : "";

}

/* Posts Extracted, Delete the Triggers */
function deleteTriggers_() {
  var triggers = ScriptApp.getProjectTriggers();
  for (var i=0; i<triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i]);
  }
}

Это ошибка, возникающая при запуске скрипта:

TypeError: невозможно прочитать свойство getChildren неопределенного значения (строка 29, код файла)

Вот фид URL: https://www.reddit.com/r/HomeImprovement/new.xml?limit=100

Любая помощь?

Спасибо

больше текста больше текста больше текста больше текста больше текста


person Mauro Bros    schedule 19.08.2020    source источник
comment
1. Reddit также предоставляет json-канал. Зачем вы парсите xml? 2. Почему бы вам не сказать нам, какая строка является 29-й строкой? Вы ожидаете, что мы будем считать и выяснять?   -  person TheMaster    schedule 19.08.2020


Ответы (1)


Линия

var entries = root.getChildren("feed")[0].getChildren("entry");

выдает ошибку, потому что <feed> является корневым элементом документа и не содержит другого элемента <feed> внутри, поэтому выражение root.getChildren("feed")[0] возвращает undefined, а затем выполняется

var entries = undefined.getChildren("entry");

Кроме того, вам необходимо включить пространство имен чтобы получить все <entry> элементов.

var namespace = XmlService.getNamespace("http://www.w3.org/2005/Atom");
var entries = root.getChildren("entry", namespace);
person dwmorrin    schedule 19.08.2020