【问题标题】:Error in Google Sheets Script when parsing XML解析 XML 时 Google 表格脚本出错
【发布时间】:2019-07-06 18:53:12
【问题描述】:

我在 Google Sheets 脚本中运行了这个函数,该脚本从 subreddits 中提取 HTML 并将它们返回到电子表格。它在某些/大部分时间对我有用,但其他时候我收到一个错误“无法解析文本。(第 13 行)”这是 var doc = Xml.parse(page, true); 的行。知道为什么会发生这种情况,或者这只是 Google Scripts 的一个错误吗?这是有效的代码……有时。

function getRedditHTML() {

  var entries_array = [];
  var subreddit_array = ['https://www.reddit.com/r/news/','https://www.reddit.com/r/funny/','https://www.reddit.com/r/science/'];

  for (var s = 0; s < subreddit_array.length; s++) {

    var page = UrlFetchApp.fetch(subreddit_array[s]);

    //this is Line 13 that is breaking
    var doc = Xml.parse(page, true);

    var bodyHtml = doc.html.body.toXmlString();
    doc = XmlService.parse(bodyHtml);
    var root = doc.getRootElement();
    var entries = getElementsByClassName(root,'thing');

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

      var title = getElementsByClassName(entries[i],'title');
      title = XmlService.getRawFormat().format(title[1]).replace(/<[^>]*>/g, "");

      var link = getElementsByClassName(entries[i],'comments');
      link = link[0].getAttribute('href').getValue();

      var rank = getElementsByClassName(entries[i],'rank');
      rank = rank[0].getValue();

      var likes = getElementsByClassName(entries[i],'likes');
      likes = likes[0].getValue();


      entries_array.push([rank, likes, title, link]);
    }
  }

  return entries_array.sort(function (a, b) { 
    return b[1] - a[1];
  });
}

【问题讨论】:

  • 您的脚本在我尝试时根本不起作用 - 我也没有看到任何名为 thing 的类 - 有诸如 thing_id 之类的标签 - 是否必须这样做它通过应用程序脚本为您服务?因为我还有其他几种非常简单的方法可以将其直接导入工作表中
  • 刚刚在 Google 表格脚本中尝试了上述代码,它对我有用。 thing 类位于每个包含 HTML 帖子的 div 上。每个 div 也有一个唯一的 id,但我想提取所有帖子,这就是我按类名提取的原因。我尝试了 Google Sheets 中的其他内置函数(例如IMPORTFEED),但它不能给我想要的特定值,比如“排名”或“喜欢”,所以我决定制作这个脚本。如果您有其他方法,请告诉我。

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


【解决方案1】:

这是我在玩 importXML 时发现的(我通常的做法)——出于某种原因,我无法缩小范围——它似乎会随机停止并在几分钟内返回 null——所以我猜你的问题不是代码,而是网站或谷歌暂时阻止/不会返回数据-

但是,我找到了您想要的部分的 JSON 端点 - 我注意到当 XML 出现故障时 - JSON 没有。

您可以接受并修复它以推送您自己的主题/网址数组 - 我现在只是将它留给一个链接,以向您展示网址如何分解以及应该在哪里修改:

网址是'https://www.reddit.com/r/news/hot.json?raw_json=1&amp;subredditName=news&amp;sort=top&amp;t=day&amp;feature=link_preview&amp;sr_detail=true&amp;app=mweb-client

News 在 2 个地方被提及,因此只需修改所有 URL 以遵循该方法 - 您可以轻松地在浏览器中加载该 javascript 以查看所有可用字段

另外,hot.json 部分是您可以更改是否需要排名列表(称为热门)或新、顶部、已推广等的地方。您只需更改该关键字。

分数与点赞数相同

function getSubReddit() {  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet(); //get Active sheet
  var subject = 'news';
  var url = 'https://www.reddit.com/r/' + subject + '/hot.json?raw_json=1&subredditName=' + subject + '&sort=top&t=day&feature=link_preview&sr_detail=true&app=mweb-client'; //json endpoint for data

  var response = UrlFetchApp.fetch(url); // get api endpoint
  var json = response.getContentText(); // get the response content as text
  var redditData = JSON.parse(json); //parse text into json

  Logger.log(redditData); //log data to logger to check

  //create empty array to hold data points
  var statsRows = [];
  var date = new Date(); //create new date for timestamp


    //The following lines push the parsed json into empty stats array
    for (var j=0;j<25;j++){      
    for (var i =0;i<25;i++){
    var stats=[];

    stats.push(date);//timestamp 
    stats.push(i+1);
    stats.push(redditData.data.children[i].data.score); //score
    stats.push(redditData.data.children[i].data.title); //title
    stats.push(redditData.data.children[i].data.url); //article url
  // stats.push('http://www.reddit.com' + redditData.data.children[i].data.permalink); //reddit permalink

  statsRows.push(stats)

    }
      //append the stats array to the active sheet
      sheet.appendRow(statsRows[j])
  }


}

【讨论】:

    猜你喜欢
    • 2022-11-27
    • 2022-07-06
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-25
    • 2023-01-15
    相关资源
    最近更新 更多