如何使用JavaScript解析RSS feed?


116

我需要解析RSS feed(XML版本2.0)并在HTML页面中显示已解析的详细信息。


12
1)您到底尝试了什么?2)您到底想解析什么?(您要从提要中提取哪些信息?)3)您希望页面中的确切位置显示什么?4)您的HTML标记到底什么?缺少这些,我们都想假装自己是大卫·科波菲尔(David Copperfield),但我不确定我们是否会长期欺骗观众。
haylem 2012年

不,我有一个连续的饲料。我无法发布。那就是为什么我在这里放样品
提鲁

好的,但这不是示例。它只是一个不存在页面的URL。在这种情况下,我的答案有一个“样本”。这是FEED_URL变量。只需将您需要的东西放在那里。如果您需要更多帮助,还需要提供更多详细信息,包括所需的供稿的哪些元素,HTMK存根的外观,要在何处注入生成的HTML存根,以及提供真实的示例的RSS提要(只需复制摘录,然后将实际内容替换为占位符)。
haylem 2012年

Answers:


216

解析提要

使用jQueryjFeed

(不建议这样做,请参阅其他选项。)

jQuery.getFeed({
   url     : FEED_URL,
   success : function (feed) {
      console.log(feed.title);
      // do more stuff here
   }
});

借助jQuery的内置XML支持

$.get(FEED_URL, function (data) {
    $(data).find("entry").each(function () { // or "item" or whatever suits your feed
        var el = $(this);

        console.log("------------------------");
        console.log("title      : " + el.find("title").text());
        console.log("author     : " + el.find("author").text());
        console.log("description: " + el.find("description").text());
    });
});

使用jQueryGoogle AJAX Feed API

$.ajax({
  url      : document.location.protocol + '//ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&callback=?&q=' + encodeURIComponent(FEED_URL),
  dataType : 'json',
  success  : function (data) {
    if (data.responseData.feed && data.responseData.feed.entries) {
      $.each(data.responseData.feed.entries, function (i, e) {
        console.log("------------------------");
        console.log("title      : " + e.title);
        console.log("author     : " + e.author);
        console.log("description: " + e.description);
      });
    }
  }
});

但这意味着您依赖它们在线且可访问。


建筑内容

从Feed中成功提取所需的信息后,您可以创建DocumentFragments(其中document.createDocumentFragment()包含document.createElement()要创建的元素(用创建)),以显示数据。


注入内容

选择页面上所需的容器元素,并将文档片段附加到该容器元素,然后只需使用innerHTML完全替换其内容即可。

就像是:

$('#rss-viewer').append(aDocumentFragmentEntry);

要么:

$('#rss-viewer')[0].innerHTML = aDocumentFragmentOfAllEntries.innerHTML;

测试数据

使用此问题的feed,在撰写本文时给出了:

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:re="http://purl.org/atompub/rank/1.0">
    <title type="text">How to parse a RSS feed using javascript? - Stack Overflow</title>
    <link rel="self" href="https://stackoverflow.com/feeds/question/10943544" type="application/atom+xml" />
        <link rel="hub" href="http://pubsubhubbub.appspot.com/" />        
    <link rel="alternate" href="https://stackoverflow.com/q/10943544" type="text/html" />
    <subtitle>most recent 30 from stackoverflow.com</subtitle>
    <updated>2012-06-08T06:36:47Z</updated>
    <id>https://stackoverflow.com/feeds/question/10943544</id>
    <creativeCommons:license>http://www.creativecommons.org/licenses/by-sa/3.0/rdf</creativeCommons:license> 
    <entry>
        <id>https://stackoverflow.com/q/10943544</id>
        <re:rank scheme="http://stackoverflow.com">2</re:rank>
        <title type="text">How to parse a RSS feed using javascript?</title>
        <category scheme="https://stackoverflow.com/feeds/question/10943544/tags" term="javascript"/><category scheme="https://stackoverflow.com/feeds/question/10943544/tags" term="html5"/><category scheme="https://stackoverflow.com/feeds/question/10943544/tags" term="jquery-mobile"/>
        <author>
            <name>Thiru</name>
            <uri>https://stackoverflow.com/users/1126255</uri>
        </author>
        <link rel="alternate" href="/programming/10943544/how-to-parse-a-rss-feed-using-javascript" />
        <published>2012-06-08T05:34:16Z</published>
        <updated>2012-06-08T06:35:22Z</updated>
        <summary type="html">
            &lt;p&gt;I need to parse the RSS-Feed(XML version2.0) using XML and I want to display the parsed detail in HTML page, I tried in many ways. But its not working. My system is running under proxy, since I am new to this field, I don&#39;t know whether it is possible or not. If any one knows please help me on this. Thanks in advance.&lt;/p&gt;

        </summary>
    </entry>
    <entry>
        <id>https://stackoverflow.com/questions/10943544/-/10943610#10943610</id>
        <re:rank scheme="http://stackoverflow.com">1</re:rank>
        <title type="text">Answer by haylem for How to parse a RSS feed using javascript?</title>
        <author>
            <name>haylem</name>
            <uri>https://stackoverflow.com/users/453590</uri>
        </author>    
        <link rel="alternate" href="/programming/10943544/how-to-parse-a-rss-feed-using-javascript/10943610#10943610" />
        <published>2012-06-08T05:43:24Z</published>   
        <updated>2012-06-08T06:35:22Z</updated>
        <summary type="html">&lt;h1&gt;Parsing the Feed&lt;/h1&gt;

&lt;h3&gt;With jQuery&#39;s jFeed&lt;/h3&gt;

&lt;p&gt;Try this, with the &lt;a href=&quot;http://plugins.jquery.com/project/jFeed&quot; rel=&quot;nofollow&quot;&gt;jFeed&lt;/a&gt; &lt;a href=&quot;http://www.jquery.com/&quot; rel=&quot;nofollow&quot;&gt;jQuery&lt;/a&gt; plug-in&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;jQuery.getFeed({
   url     : FEED_URL,
   success : function (feed) {
      console.log(feed.title);
      // do more stuff here
   }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;With jQuery&#39;s Built-in XML Support&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;$.get(FEED_URL, function (data) {
    $(data).find(&quot;entry&quot;).each(function () { // or &quot;item&quot; or whatever suits your feed
        var el = $(this);

        console.log(&quot;------------------------&quot;);
        console.log(&quot;title      : &quot; + el.find(&quot;title&quot;).text());
        console.log(&quot;author     : &quot; + el.find(&quot;author&quot;).text());
        console.log(&quot;description: &quot; + el.find(&quot;description&quot;).text());
    });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;With jQuery and the Google AJAX APIs&lt;/h3&gt;

&lt;p&gt;Otherwise, &lt;a href=&quot;https://developers.google.com/feed/&quot; rel=&quot;nofollow&quot;&gt;Google&#39;s AJAX Feed API&lt;/a&gt; allows you to get the feed as a JSON object:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$.ajax({
  url      : document.location.protocol + &#39;//ajax.googleapis.com/ajax/services/feed/load?v=1.0&amp;amp;num=10&amp;amp;callback=?&amp;amp;q=&#39; + encodeURIComponent(FEED_URL),
  dataType : &#39;json&#39;,
  success  : function (data) {
    if (data.responseData.feed &amp;amp;&amp;amp; data.responseData.feed.entries) {
      $.each(data.responseData.feed.entries, function (i, e) {
        console.log(&quot;------------------------&quot;);
        console.log(&quot;title      : &quot; + e.title);
        console.log(&quot;author     : &quot; + e.author);
        console.log(&quot;description: &quot; + e.description);
      });
    }
  }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But that means you&#39;re relient on them being online and reachable.&lt;/p&gt;

&lt;hr&gt;

&lt;h1&gt;Building Content&lt;/h1&gt;

&lt;p&gt;Once you&#39;ve successfully extracted the information you need from the feed, you need to create document fragments containing the elements you&#39;ll want to inject to display your data.&lt;/p&gt;

&lt;hr&gt;

&lt;h1&gt;Injecting the content&lt;/h1&gt;

&lt;p&gt;Select the container element that you want on the page and append your document fragments to it, and simply use innerHTML to replace its content entirely.&lt;/p&gt;
</summary>
    </entry></feed>

执行力

使用jQuery的内置XML支持

调用:

$.get('https://stackoverflow.com/feeds/question/10943544', function (data) {
    $(data).find("entry").each(function () { // or "item" or whatever suits your feed
        var el = $(this);

        console.log("------------------------");
        console.log("title      : " + el.find("title").text());
        console.log("author     : " + el.find("author").text());
        console.log("description: " + el.find("description").text());
    });
});

打印输出:

------------------------
title      : How to parse a RSS feed using javascript?
author     : 
            Thiru
            https://stackoverflow.com/users/1126255

description: 
------------------------
title      : Answer by haylem for How to parse a RSS feed using javascript?
author     : 
            haylem
            https://stackoverflow.com/users/453590

description: 

使用jQuery和Google AJAX API

调用:

$.ajax({
  url      : document.location.protocol + '//ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&callback=?&q=' + encodeURIComponent('https://stackoverflow.com/feeds/question/10943544'),
  dataType : 'json',
  success  : function (data) {
    if (data.responseData.feed && data.responseData.feed.entries) {
      $.each(data.responseData.feed.entries, function (i, e) {
        console.log("------------------------");
        console.log("title      : " + e.title);
        console.log("author     : " + e.author);
        console.log("description: " + e.description);
      });
    }
  }
});

打印输出:

------------------------
title      : How to parse a RSS feed using javascript?
author     : Thiru
description: undefined
------------------------
title      : Answer by haylem for How to parse a RSS feed using javascript?
author     : haylem
description: undefined

1
谢谢您的回答。但是我没有得到输出。javascript是否可以?
提鲁

1
@Thiru:我刚刚用这个问题的RSS feed尝试了最后一种方法(stackoverflow.com/feeds/question/10943544),它对我来说很好用。
haylem 2012年

8
您可能在这里有完整的工作代码段。我相信您可以自行解决其余的问题。
haylem 2012年

2
@Timmy:在做什么?您是提鲁的朋友吗?您有类似的问题报告技术。我只是将最后2个代码段复制粘贴到控制台中,然后运行它们并获得了预期的输出。您为什么资源做了什么,如何做?
haylem 2014年

2
不推荐使用Google AJAX API。自2017
。– Ezee

39

另一个不推荐使用 (感谢@daylight)选项,对我来说最简单(这是我在SpokenToday.info中使用的选项):

不使用JQuery且仅执行两个步骤的Google Feed API

  1. 导入库:

    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript">google.load("feeds", "1");</script>
    
  2. 查找/加载提要(文档):

    var feed = new google.feeds.Feed('http://www.google.com/trends/hottrends/atom/feed?pn=p1');
    feed.load(function (data) {
        // Parse data depending on the specified response format, default is JSON.
        console.dir(data);
    });
    
  3. 要解析数据,请查看有关响应格式的文档


5
Google说:此API已正式弃用。

23
自2015年12月2日起,Google Feed API已被弃用。Bummer
raddevus

根据该代码,您能否添加输入提要URL的提示,然后将属性连接起来以包含一个值,以便解析所需的rss提要?例如,如果我要处理多个图像,则可以将字符串和值连接起来:document.getElementById('image').style.backgroundImage = "url('" + src + "')";
noobninja

2
不推荐使用Google AJAX API。自2017
Ezee'1

7
有人知道Googles API现已关闭时,还有其他合适的选择吗?
Duellsy

3

如果您正在为rss小部件寻找Google Feed API的简单免费替代方案,那么rss2json.com可能是一个合适的解决方案。

您可以尝试从下面的api文档中查看示例代码的工作方式:

google.load("feeds", "1");

    function initialize() {
      var feed = new google.feeds.Feed("https://news.ycombinator.com/rss");
      feed.load(function(result) {
        if (!result.error) {
          var container = document.getElementById("feed");
          for (var i = 0; i < result.feed.entries.length; i++) {
            var entry = result.feed.entries[i];
            var div = document.createElement("div");
            div.appendChild(document.createTextNode(entry.title));
            container.appendChild(div);
          }
        }
      });
    }
    google.setOnLoadCallback(initialize);
<html>
  <head>    
     <script src="https://rss2json.com/gfapi.js"></script>
  </head>
  <body>
    <p><b>Result from the API:</b></p>
    <div id="feed"></div>
  </body>
</html>


3

不幸的是,对于其他人(从2019年起)阅读本文,大多数JS RSS阅读实现现在都无法使用。首先,Google API已关闭,因此这不再是一种选择,并且由于CORS安全策略的原因,您现在通常无法跨域请求RSS feed。

使用https://www.raymondcamden.com/2015/12/08/parsing-rss-feeds-in-javascript-options(2015)上的示例,我得到以下信息:

Access to XMLHttpRequest at 'https://feeds.feedburner.com/raymondcamdensblog?format=xml' from origin 'MYSITE' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

这是正确的,并且是最终网站的安全预防措施,但现在确实意味着上述答案不太可能起作用。

我的解决方法可能是通过PHP解析RSS feed,并允许javascript访问我的PHP,而不是尝试访问最终目标feed本身。


1

如果您想使用普通的javascript API,请参阅https://github.com/hongkiat/js-rss-reader/

有关完整说明,访问https://www.hongkiat.com/blog/rss-reader-in-javascript/

它使用fetchmethod作为异步获取资源的全局方法。下面是一段代码:

fetch(websiteUrl).then((res) => {
  res.text().then((htmlTxt) => {
    var domParser = new DOMParser()
    let doc = domParser.parseFromString(htmlTxt, 'text/html')
    var feedUrl = doc.querySelector('link[type="application/rss+xml"]').href
  })
}).catch(() => console.error('Error in fetching the website'))

您引用的文章中的示例无法按原样工作。您需要修改rss.js中的第15和26行,以使用CORS代理使其起作用。如果不这样做,由于“相同来源”策略,您将得到一些错误:developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/…。此外,fetch API在Microsoft Internet Explorer 11,而不是使用XMLHTTPRequest:developer.microsoft.com/en-us/microsoft-edge/status/fetchapi我在自己的服务器上使用了此源代码。我鼓励您花一些时间在发布之前执行一些检查。
gouessej

CORS问题与此答案无关。请重新阅读您提到的CORS链接或其他一些有关解决CORS问题的资源 stackoverflow.com/questions/10636611/…
Alireza Fattahi

没有CORS问题与您的答案有关。您引用的文章中的示例不能按原样使用,并且显然是由主机来设置这些标头,它不能在客户端固定,唯一的解决方法是使用CORS代理。您是否尝试过本文提到的源代码?
gouessej

当然,我们正在混合移动应用程序中使用它,没有任何问题。
Alireza Fattahi

一个Mozilla贡献者关闭了我的关于我在自己的项目中使用此源代码的问题,建议我使用CORS代理。它可以在服务器端工作,也许可以在Node.JS中工作,但是不能像在客户端那样工作。我不是唯一一个对此源代码有此问题的人,并且在css-tricks的类似文章中看到了一些评论:css-tricks.com/how-to-fetch-and-parse-rss-feeds-in -javascript /…您的情况非常特殊。
gouessej

0

您可以使用jquery-rssVanilla RSS,这些模板带有不错的模板并且非常易于使用:

// Example for jquery.rss
$("#your-div").rss("https://stackoverflow.com/feeds/question/10943544", {
    limit: 3,
    layoutTemplate: '<ul class="inline">{entries}</ul>',
    entryTemplate: '<li><a href="{url}">[{author}@{date}] {title}</a><br/>{shortBodyPlain}</li>'
})

// Example for Vanilla RSS
const RSS = require('vanilla-rss');
const rss = new RSS(
    document.querySelector("#your-div"),
    "https://stackoverflow.com/feeds/question/10943544",
    { 
      // options go here
    }
);
rss.render().then(() => {
  console.log('Everything is loaded and rendered');
});

有关工作示例,请参见http://jsfiddle.net/sdepold/ozq2dn9e/1/


0

现在,为了设法找到一个好的解决方案,我遇到了FeedEk jQuery RSS / ATOM Feed插件,该插件通过jQuery Feed API很好地解析和显示RSS和Atom feed 。对于基于XML的基本RSS提要,我发现它的工作原理很吸引人,不需要服务器端脚本或其他CORS解决方法就可以在本地运行。


0

我被许多误导性的文章和答案所激怒,以至于我写了自己的RSS阅读器:https : //gouessej.wordpress.com/2020/06/28/comment-creer-un-lecteur-rss-en-javascript-how-在javascript /中创建一个RSS阅读器

您可以使用AJAX请求来获取RSS文件,但是只有在使用CORS代理的情况下,它才能工作。我将尝试编写自己的CORS代理,以为您提供更强大的解决方案。同时,它可以工作,我将其部署在Debian Linux下的服务器上。

我的解决方案不使用JQuery,我仅使用无第三方库的普通Javascript标准API,并且即使在Microsoft Internet Explorer 11中也可以使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.