Làm cách nào để phân tích nguồn cấp RSS bằng JavaScript?


116

Tôi cần phân tích nguồn cấp RSS (phiên bản XML 2.0) và hiển thị các chi tiết được phân tích cú pháp trong trang HTML.


12
1) Chính xác những gì bạn đã cố gắng? 2) Chính xác những gì bạn muốn phân tích? (thông tin nào bạn muốn trích xuất từ ​​nguồn cấp dữ liệu?) 3) Chính xác thì bạn muốn nó hiển thị ở đâu trong trang của bạn? 4) Chính xác đánh dấu HTML của bạn là gì? Nói tóm lại, tất cả chúng ta đều thích giả vờ rằng chúng ta là David Copperfield, nhưng tôi không chắc chúng ta sẽ đánh lừa khán giả từ lâu.
haylem

Không, tôi có một nguồn cấp dữ liệu liên tiếp với tôi. Tôi không thể xuất bản nó. Đó là lý do tại sao tôi đặt một mẫu ở đây
Thiru

ok nhưng đó không phải là một mẫu. Nó chỉ là một URL đến một trang không tồn tại. Trong trường hợp đó, câu trả lời của tôi có một "mẫu". Đây là biến FEED_URL. Chỉ cần đặt những gì bạn cần trong đó. Nếu bạn cần thêm trợ giúp, bạn cũng cần cung cấp thêm chi tiết về các yếu tố của nguồn cấp dữ liệu bạn cần, bạn muốn các cuống HTMK trông như thế nào, nơi bạn muốn tiêm các cuống HTML đã tạo và bạn cũng có thể cung cấp một mẫu thực của nguồn cấp dữ liệu RSS của bạn (chỉ cần sao chép pase một đoạn trích và thay thế nội dung thực tế bằng trình giữ chỗ).
haylem

Câu trả lời:


216

Phân tích cú pháp thức ăn

Với jQuery 's jFeed

(Đừng thực sự khuyên bạn rằng, hãy xem các tùy chọn khác.)

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

Với Hỗ trợ XML tích hợp của 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());
    });
});

Với jQueryAPI nguồn cấp dữ liệu AJAX của Google

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

Nhưng điều đó có nghĩa là bạn tin tưởng vào việc họ đang trực tuyến và có thể truy cập.


Xây dựng nội dung

Khi bạn đã trích xuất thành công thông tin bạn cần từ nguồn cấp dữ liệu, bạn có thể tạo DocumentFragments (có document.createDocumentFragment()chứa các yếu tố (được tạo bằng document.createElement()) bạn sẽ muốn tiêm để hiển thị dữ liệu của mình.


Tiêm nội dung

Chọn thành phần chứa mà bạn muốn trên trang và nối các đoạn tài liệu của bạn vào đó và chỉ cần sử dụng InternalHTML để thay thế hoàn toàn nội dung của nó.

Cái gì đó như:

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

hoặc là:

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

Kiểm tra dữ liệu

Sử dụng nguồn cấp dữ liệu của câu hỏi này , mà khi viết bài này đưa ra:

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

Thi hành

Sử dụng Hỗ trợ XML tích hợp của jQuery

Kêu gọi:

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

In ra:

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

Sử dụng jQuery và API AJAX của Google

Kêu gọi:

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

In ra:

------------------------
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
Cảm ơn câu trả lời của bạn haylem. Nhưng tôi đã không nhận được một đầu ra cho điều này. Là ot có thể với javascript?
Thiru

1
@Thiru: Tôi vừa thử phương pháp cuối cùng với nguồn cấp dữ liệu RSS của câu hỏi này ( stackoverflow.com/feed/question/10943544 ) và nó hoạt động tốt với tôi.
haylem

8
Bạn có thể có toàn bộ đoạn mã làm việc ở đây. Tôi chắc rằng bạn có thể tự mình giải quyết phần còn lại.
haylem

2
@Timmy: làm gì? Bạn có phải là bạn của Thiru không? Bạn có kỹ thuật báo cáo vấn đề tương tự. Tôi chỉ sao chép 2 đoạn mã cuối vào bảng điều khiển của mình và chạy chúng và nhận được kết quả như mong đợi. Bạn đã làm gì, làm thế nào, cho tài nguyên gì?
haylem

2
API AJAX của Google không được chấp nhận. Nó không có sẵn kể từ tháng 1 năm 2017.
Ezee

39

Một tùy chọn không dùng nữa (nhờ @daylight) và dễ nhất đối với tôi (đây là những gì tôi đang sử dụng cho SpokenToday.info ):

Các API cấp dữ liệu Google mà không sử dụng JQuery và chỉ với 2 bước sau:

  1. Nhập thư viện:

    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript">google.load("feeds", "1");</script>
    
  2. Tìm / Tải nguồn cấp dữ liệu ( tài liệu ):

    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. Để phân tích dữ liệu, kiểm tra tài liệu về định dạng phản hồi .


5
Google nói: API này chính thức không còn dùng nữa.

23
API Google Feed không được dùng nữa và không còn hoạt động kể từ ngày 12/02/2015. Bummer
raddevus 2/12/2015

dựa trên mã đó, bạn có thể thêm lời nhắc nhập url nguồn cấp dữ liệu, sau đó ghép thuộc tính để bao gồm một giá trị để phân tích bất kỳ nguồn cấp dữ liệu rss nào bạn muốn không? ví dụ: nếu tôi đang xử lý nhiều hình ảnh, tôi có thể nối chuỗi và giá trị:document.getElementById('image').style.backgroundImage = "url('" + src + "')";
noobninja

2
API AJAX của Google không được chấp nhận. Nó không có sẵn kể từ tháng 1 năm 2017
Ezee

7
có ai biết một giải pháp thay thế phù hợp bây giờ khi API của Google không hoạt động không?
duellsy

3

Nếu bạn đang tìm kiếm một giải pháp thay thế đơn giản và miễn phí cho Google Feed API cho tiện ích rss của mình thì rss2json.com có thể là một giải pháp phù hợp cho việc đó.

Bạn có thể thử xem nó hoạt động như thế nào trên một mã mẫu từ tài liệu api bên dưới:

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

Đối với bất kỳ ai khác đọc điều này (vào năm 2019 trở đi), thật không may, hầu hết các triển khai đọc RSS của JS hiện không hoạt động. Đầu tiên, Google API đã ngừng hoạt động nên đây không còn là một tùy chọn nữa và vì chính sách bảo mật của CORS, hiện tại bạn không thể yêu cầu các nguồn cấp dữ liệu RSS tên miền chéo.

Sử dụng ví dụ trên https://www.raymondcamden.com/2015/12/08/parsing-rss-feed-in-javascript-options (2015) Tôi nhận được như sau:

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.

Điều này là chính xác và là một biện pháp phòng ngừa bảo mật của trang web cuối nhưng hiện tại có nghĩa là các câu trả lời ở trên không có khả năng hoạt động.

Cách giải quyết của tôi có lẽ là phân tích nguồn cấp RSS thông qua PHP và cho phép javascript truy cập PHP của tôi thay vì cố gắng truy cập vào nguồn cấp dữ liệu đích cuối.


1

Nếu bạn muốn sử dụng API javascript đơn giản, có một ví dụ hay tại https://github.com/hongkiat/js-rss-reader/

Mô tả đầy đủ tại https://www.hongkiat.com/blog/rss-reader-in-javascript/

Nó sử dụng fetchphương thức như một phương thức toàn cầu tìm nạp tài nguyên không đồng bộ. Dưới đây là một đoạn mã:

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

Ví dụ trong bài viết bạn trích dẫn không hoạt động như vậy. Bạn cần sửa đổi các dòng 15 và 26 trong rss.js để sử dụng proxy CORS để làm cho nó hoạt động. Nếu bạn không, bạn sẽ gặp một số lỗi do chính sách Xuất xứ tương tự: developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/ , Hơn nữa, API tìm nạp không hoạt động trong Microsoft Internet Explorer 11, thay vì sử dụng XMLHTTPRequest: developer.microsoft.com/en-us/microsoft-edge/status/fetchapi Tôi đã sử dụng mã nguồn này trên máy chủ của riêng mình. Tôi khuyến khích bạn dành một chút thời gian để thực hiện một số kiểm tra trước khi đăng.
gouliej

Vấn đề CORS không liên quan đến câu trả lời này. Vui lòng đọc lại liên kết CORS mà bạn đã đề cập hoặc một số tài nguyên khác về cách khắc phục sự cố CORS stackoverflow.com/questions/10636611/ .
Alireza Fattahi

Không có vấn đề CORS có liên quan đến câu trả lời của bạn. Ví dụ trong bài viết mà bạn trích dẫn không thể được sử dụng và rõ ràng tùy thuộc vào máy chủ để đặt các tiêu đề đó, nó không thể được sửa ở phía máy khách, cách giải quyết duy nhất bao gồm sử dụng proxy CORS. Bạn đã bao giờ thử mã nguồn được đề cập trong bài viết này?
gouliej

Tất nhiên, chúng tôi đang sử dụng nó trong một ứng dụng di động lai mà không có vấn đề gì.
Alireza Fattahi

Một người đóng góp Mozilla đã đóng một câu hỏi của tôi về việc tôi sử dụng mã nguồn này trong dự án của riêng tôi khuyên tôi nên sử dụng proxy CORS. Nó có thể hoạt động ở phía máy chủ, có thể ở Node.JS nhưng nó không thể hoạt động như ở phía máy khách. Tôi không phải là người duy nhất gặp vấn đề với mã nguồn này và tôi đã thấy một số nhận xét trong một bài viết tương tự về css-trick: css-tricks.com/how-to-fetch-and-parse-rss-feed-in -javascript / Thẻ Bạn đang ở trong một trường hợp rất cụ thể.
gouliej

0

Bạn có thể sử dụng jquery-rss hoặc Vanilla RSS , đi kèm với tạo khuôn mẫu đẹp và cực kỳ dễ sử dụng:

// 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');
});

Xem http://jsfiddle.net/sdepold/ozq2dn9e/1/ để biết ví dụ hoạt động.


0

Cố gắng tìm một giải pháp tốt cho việc này ngay bây giờ, tôi đã tình cờ thấy Plugin Feed RSS RSS / ATOM của FeedEk thực hiện công việc phân tích và hiển thị các nguồn cấp dữ liệu RSS và Atom thông qua API nguồn cấp dữ liệu jQuery . Đối với nguồn cấp RSS dựa trên XML cơ bản, tôi đã thấy nó hoạt động như một bùa mê và không cần các tập lệnh phía máy chủ hoặc các cách giải quyết CORS khác để nó chạy ngay cả cục bộ.


0

Tôi đã rất bực tức vì nhiều bài báo và câu trả lời sai lệch đến nỗi tôi đã viết trình đọc RSS của riêng mình: https://gouessej.wordpress.com/2020/06/28/comment-creer-un-lecteur-rss-en-javascript-how- to-created-a-rss-reader-in-javascript /

Bạn có thể sử dụng các yêu cầu AJAX để tìm nạp các tệp RSS nhưng nó sẽ hoạt động nếu và chỉ khi bạn sử dụng proxy CORS. Tôi sẽ cố gắng viết proxy CORS của riêng tôi để cung cấp cho bạn một giải pháp mạnh mẽ hơn. Trong khi đó, nó hoạt động, tôi đã triển khai nó trên máy chủ của mình trong Debian Linux.

Giải pháp của tôi không sử dụng JQuery, tôi chỉ sử dụng các API tiêu chuẩn Javascript đơn giản không có thư viện bên thứ ba và nó được cho là hoạt động ngay cả với Microsoft Internet Explorer 11.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.