【问题标题】:Reddit feed parser with Google App Script带有 Google 应用脚本的 Reddit 提要解析器
【发布时间】:2020-08-19 08:53:43
【问题描述】:

这是我的 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 行,文件“代码”)

这里是网址供稿:https://www.reddit.com/r/HomeImprovement/new.xml?limit=100

有什么帮助吗?

谢谢

更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本更多文本

【问题讨论】:

  • 1.Reddit 也提供 json feed。你为什么要解析xml? 2. 为什么不告诉我们第 29 行是哪一行?您希望我们数数并弄清楚吗?

标签: parsing google-apps-script google-sheets xml-parsing


【解决方案1】:

线

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

抛出错误,因为&lt;feed&gt; 文档的根元素并且里面不包含另一个&lt;feed&gt;元素,所以root.getChildren("feed")[0]表达式返回undefined然后你运行

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

此外,您需要包含namespace 才能获取所有&lt;entry&gt; 元素。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多