วิธีแยกวิเคราะห์ RSS feed โดยใช้ JavaScript


116

ฉันต้องการแยกวิเคราะห์ฟีด RSS (XML เวอร์ชัน 2.0) และแสดงรายละเอียดที่แยกวิเคราะห์ในหน้า HTML


12
1) สิ่งที่มีคุณพยายาม? 2) สิ่งที่คุณต้องการที่จะแยก? (ซึ่งข้อมูลที่คุณต้องการจะสารสกัดจากฟีด?) 3) ที่ว่าคุณจะต้องการแสดงในหน้าของคุณหรือไม่ 4) สิ่งที่ว่าเป็นมาร์กอัป HTML ของคุณ? สั้น ๆ เราทุกคนชอบแกล้งทำเป็นว่าเราคือเดวิดคอปเปอร์ฟิลด์ แต่ฉันไม่แน่ใจว่าเราหลอกผู้ชมได้นานมาก
haylem

ไม่ฉันมีฟีดต่อเนื่องกับฉัน ฉันไม่สามารถเผยแพร่ได้ นั่นคือเหตุผลที่ฉันใส่ตัวอย่างไว้ที่นี่
Thiru

โอเค แต่นั่นไม่ใช่ตัวอย่าง เป็นเพียง URL ไปยังหน้าที่ไม่มีอยู่จริง ในกรณีนี้คำตอบของฉันมี "ตัวอย่าง" มันคือตัวแปร FEED_URL เพียงใส่สิ่งที่คุณต้องการลงในนั้น หากคุณต้องการความช่วยเหลือเพิ่มเติมคุณต้องให้รายละเอียดเพิ่มเติมเกี่ยวกับองค์ประกอบของฟีดที่คุณต้องการสิ่งที่คุณต้องการให้สตริป HTMK มีลักษณะที่คุณต้องการฉีดสตับ HTML ที่สร้างขึ้นและคุณยังสามารถให้ตัวอย่างจริงได้อีกด้วย ของฟีด RSS ของคุณ (เพียงแค่คัดลอกข้อความที่ตัดตอนมาและแทนที่เนื้อหาจริงด้วยตัวยึดตำแหน่ง)
haylem

คำตอบ:


216

การแยกวิเคราะห์ฟีด

ด้วยjFeedของjQuery

(ไม่แนะนำให้ดูตัวเลือกอื่น ๆ )

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

ด้วยการสนับสนุน XML ในตัวของjQuery

$.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());
    });
});

ด้วยjQueryและGoogle 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);
      });
    }
  }
});

แต่นั่นหมายความว่าคุณวางใจได้ว่าพวกเขาออนไลน์และเข้าถึงได้


การสร้างเนื้อหา

เมื่อคุณดึงข้อมูลที่ต้องการจากฟีดเรียบร้อยแล้วคุณสามารถสร้างDocumentFragments (โดยdocument.createDocumentFragment()มีองค์ประกอบ (สร้างด้วยdocument.createElement()) ที่คุณต้องการจะฉีดเพื่อแสดงข้อมูลของคุณ


การแทรกเนื้อหา

เลือกองค์ประกอบคอนเทนเนอร์ที่คุณต้องการในหน้าและต่อท้ายส่วนเอกสารของคุณจากนั้นใช้ innerHTML เพื่อแทนที่เนื้อหาทั้งหมด

สิ่งที่ต้องการ:

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

หรือ:

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

ข้อมูลการทดสอบ

การใช้ฟีดของคำถามนี้ซึ่งจากการเขียนนี้ให้:

<?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>

การประหารชีวิต

ใช้การสนับสนุน XML ในตัวของ jQuery

อัญเชิญ:

$.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
ขอบคุณสำหรับคำตอบของคุณ haylem แต่ฉันไม่ได้รับผลลัพธ์สำหรับสิ่งนี้ ot เป็นไปได้ด้วย javascript หรือไม่?
Thiru

1
@Thiru: ฉันเพิ่งลองวิธีสุดท้ายกับ RSS feed ของคำถามนี้ ( stackoverflow.com/feeds/question/10943544 ) และมันก็ใช้ได้ดีสำหรับฉัน
haylem

8
คุณอาจมีข้อมูลโค้ดที่ใช้งานได้ทั้งหมดที่นี่ ฉันแน่ใจว่าคุณสามารถจัดการส่วนที่เหลือได้ด้วยตัวเอง
haylem

2
@ ทิมมี่: ทำอะไร? คุณเป็นเพื่อนของ Thiru หรือไม่? คุณมีเทคนิคการรายงานปัญหาที่คล้ายกัน ฉันเพิ่งคัดลอกข้อมูลโค้ด 2 รายการสุดท้ายลงในคอนโซลของฉันและเรียกใช้และได้ผลลัพธ์ตามที่คาดไว้ คุณทำอะไรทำอย่างไรเพื่อทรัพยากรอะไร
haylem

2
Google AJAX API เลิกใช้งานแล้ว ไม่สามารถใช้งานได้ตั้งแต่ ม.ค. 2017
Ezee

39

ตัวเลือกอื่นที่เลิกใช้แล้ว (ขอบคุณ @daylight)และง่ายที่สุดสำหรับฉัน (นี่คือสิ่งที่ฉันใช้สำหรับSpokenToday.info ):

ฟีด API ของ Googleโดยไม่ต้องใช้ JQuery และมีเพียง 2 ขั้นตอน

  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
Google Feed API เลิกใช้งานแล้วและไม่ทำงานอีกต่อไปตั้งแต่วันที่ 12/02/2015 Bummer
raddevus

ตามรหัสนั้นคุณสามารถเพิ่มพร้อมต์สำหรับการป้อน url ฟีดจากนั้นเชื่อมต่อคุณสมบัติเพื่อรวมค่าเพื่อแยกวิเคราะห์ฟีด rss ที่คุณต้องการได้หรือไม่? ตัวอย่างเช่นหากฉันกำลังจัดการกับภาพหลายภาพฉันสามารถต่อสตริงและค่าได้:document.getElementById('image').style.backgroundImage = "url('" + src + "')";
noobninja

2
Google AJAX API เลิกใช้งานแล้ว ไม่สามารถใช้ได้ตั้งแต่ ม.ค. 2017
Ezee

7
มีใครทราบทางเลือกอื่นที่เหมาะสมตอนนี้ที่ Googles API ไม่ทำงานบ้าง
duellsy

3

หากคุณกำลังมองหาทางเลือกที่ง่ายและฟรีสำหรับGoogle Feed APIสำหรับวิดเจ็ต rss ของคุณ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 ข้ามโดเมนได้

ใช้ตัวอย่างบน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.

สิ่งนี้ถูกต้องและเป็นข้อควรระวังด้านความปลอดภัยของเว็บไซต์สุดท้าย แต่ตอนนี้หมายความว่าคำตอบข้างต้นไม่น่าจะได้ผล

วิธีแก้ปัญหาของฉันอาจเป็นการแยกวิเคราะห์ฟีด RSS ผ่าน PHP และอนุญาตให้จาวาสคริปต์เข้าถึง PHP ของฉันแทนที่จะพยายามเข้าถึงฟีดปลายทางปลายทางเอง


1

หากคุณต้องการใช้ javascript API แบบธรรมดามีตัวอย่างที่ดีที่https://github.com/hongkiat/js-rss-reader/

คำอธิบายทั้งหมดที่ https://www.hongkiat.com/blog/rss-reader-in-javascript/

ใช้fetchวิธีการเป็นวิธีการส่วนกลางที่ดึงทรัพยากรแบบอะซิงโครนัส ด้านล่างนี้เป็นรหัสย่อ:

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'))

ตัวอย่างในบทความที่คุณอ้างอิงไม่ได้ผลตามที่เป็นอยู่ คุณต้องแก้ไขบรรทัด 15 และ 26 ใน rss.js เพื่อใช้พร็อกซี 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 ไม่เกี่ยวข้องกับคำตอบนี้ โปรดอ่านอีกครั้ง ธ ลิงค์ที่คุณกล่าวถึงหรือแหล่งข้อมูลอื่น ๆ เกี่ยวกับการแก้ไข ธ ออก 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-rssหรือVanilla 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 ฟีดปลั๊กอินที่จะได้งานที่ดีของการแยกและการแสดง RSS และ Atom ฟีดผ่าน jQuery ฟีด API สำหรับฟีด RSS ที่ใช้ XML พื้นฐานฉันพบว่ามันใช้งานได้ดีและไม่จำเป็นต้องมีสคริปต์ฝั่งเซิร์ฟเวอร์หรือวิธีแก้ปัญหา CORS อื่น ๆ เพื่อให้มันทำงานได้แม้ในเครื่อง


0

ฉันโกรธมากกับบทความและคำตอบที่ทำให้เข้าใจผิดมากมายที่ฉันเขียนโปรแกรมอ่าน RSS ของตัวเอง: https://gouessej.wordpress.com/2020/06/28/comment-creer-un-lecteur-rss-en-javascript-how- เพื่อสร้าง-a-RSS-reader ในจาวาสคริปต์ /

คุณสามารถใช้คำขอ AJAX เพื่อดึงไฟล์ RSS ได้ แต่จะใช้ได้ก็ต่อเมื่อคุณใช้พร็อกซี CORS ฉันจะพยายามเขียนพร็อกซี CORS ของตัวเองเพื่อให้ได้โซลูชันที่มีประสิทธิภาพมากขึ้น ในระหว่างนี้มันใช้งานได้ฉันติดตั้งบนเซิร์ฟเวอร์ของฉันภายใต้ Debian Linux

โซลูชันของฉันไม่ได้ใช้ JQuery ฉันใช้ API มาตรฐาน Javascript ธรรมดาเท่านั้นที่ไม่มีไลบรารีของบุคคลที่สามและควรใช้งานได้แม้กับ Microsoft Internet Explorer 11

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.