Як розібрати RSS-канал за допомогою JavaScript?


116

Мені потрібно проаналізувати RSS-канал (XML версія 2.0) і відобразити проаналізовані деталі на HTML-сторінці.


12
1) Що саме ви пробували? 2) Що саме ти хочеш розібрати? (яку інформацію ви бажаєте отримати з каналу?) 3) Де саме ви хочете, щоб вона відображалася на вашій сторінці? 4) Яка саме ваша HTML-розмітка? Незважаючи на це, ми всі любимо робити вигляд, що ми Девід Копперфілд, але я не впевнений, що ми дуже довго обдуримо публіку.
хайлем

Ні, я не маю послідовної подачі зі мною. Я не можу його опублікувати. Ось чому я поклав зразок сюди
Тіру

ОК, але це НЕ зразок. Це була лише URL-адреса до неіснуючої сторінки. У такому випадку моя відповідь має "зразок". Це змінна FEED_URL. Просто покладіть туди, що вам потрібно. Якщо вам потрібна додаткова допомога, вам також потрібно надати більше детальних відомостей про те, які елементи каналу вам потрібні, як ви хочете виглядати заглушки HTMK, куди потрібно вставити створені заглушки HTML, а також ви можете надати реальний зразок вашого RSS-каналу (просто скопіюйте, скопіюйте уривок та замініть фактичний вміст на заповнювачі).
хайлем

Відповіді:


216

Розбір каналу

З jQuery 's jFeed

(Не дуже рекомендую цього, дивіться інші варіанти.)

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 та API подачі Google AJAX

$.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 та API AJAX Google

Викликає:

$.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
Дякую за вашу відповідь, хайлем. Але я не отримав вихід для цього. Чи можливий ot за допомогою javascript?
Тіру

1
@Thiru: Я просто спробував останній метод із RSS-каналу цього питання ( stackoverflow.com/feeds/question/10943544 ), і він працював для мене чудово.
хайлем

8
Тут може бути весь фрагмент робочого коду. Я впевнений, що ви можете відпрацювати решту самостійно.
хайлем

2
@Timmy: що робити? Ти друг Тіру? У вас є аналогічні методи звітності про проблеми. Я просто скопіював останні два фрагменти коду в консоль і запустив їх і отримав результати, як очікувалося. Що ви робили, як, за який ресурс?
хайлем

2
API API AJAX Google застаріли. Він недоступний з січня 2017.
Ezee

39

Ще один застарілий (завдяки @daylight) варіант, і найпростіший для мене (це те, що я використовую для SpokenToday.info ):

Feed 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
API Google Feed застарілий і з 12.02.2015 більше не працює. Ледар
raddevus

виходячи з цього коду, чи можете ви додати запит на введення URL-адреси каналу, а потім об'єднати властивість для включення значення, щоб проаналізувати потрібний RSS-канал? Наприклад, якщо я мав справу з декількома зображеннями, я міг би об'єднати рядок і значення:document.getElementById('image').style.backgroundImage = "url('" + src + "')";
noobninja

2
API API AJAX Google застаріли. Він недоступний з січня 2017 року
Ezee

7
хтось знає про підходящу альтернативу тепер, коли API Googles не працює?
дуельсі

3

Якщо ви шукаєте просту та безкоштовну альтернативу API Google Feed для свого 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 зараз не працює. По-перше, API Google вимкнувся, тому це більше не є можливим, і через політику безпеки 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 і дозволити javascript отримати доступ до мого PHP, а не намагатися отримати доступ до каналу кінцевого призначення.


1

Якщо ви хочете використовувати звичайний API JavaScript, є хороший приклад на веб-сторінці 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, щоб він працював. Якщо ви цього не зробите, ви отримаєте деякі помилки через те саме політику Origin: developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/… Більше того, API для завантаження не працює в Microsoft Internet Explorer 11, скоріше використовуйте XMLHTTPRequest: developer.microsoft.com/en-us/microsoft-edge/status/fetchapi Я використовував цей вихідний код на власному сервері. Я рекомендую витратити якийсь час на виконання деяких перевірок перед публікацією.
gouessej

Питання CORS не відповідає цій відповіді. Будь ласка , перечитайте CORS посилання , яку ви згадали , або деякі інші ресурси про фіксацію CORS випуску stackoverflow.com/questions/10636611 / ... .
Аліреза Фаттахі

Жодне питання CORS не пов'язане з вашою відповіддю. Приклад у статті, яку ви цитуєте, не може бути використаний таким, який є, і очевидно, що хости встановлюють ці заголовки, його неможливо виправити на стороні клієнта, єдине вирішення полягає у використанні проксі-сервера CORS. Ви коли-небудь пробували згаданий у цій статті вихідний код?
gouessej

Звичайно, ми використовуємо його в гібридному мобільному додатку без жодних проблем.
Аліреза Фаттахі

Довідник Mozilla, який закрив моє питання про моє використання цього вихідного коду у власному проекті, порадив мені використовувати проксі-сервер CORS. Він може працювати на стороні сервера, можливо, в Node.JS, але він не може працювати так, як на стороні клієнта. Я не єдина людина, яка мала цю проблему з цим вихідним кодом, і я побачила деякі коментарі у подібній статті про css-трюки: css-tricks.com/how-to-fetch-and-parse-rss-feeds-in -javascript /… Ви знаходитесь у дуже конкретному випадку.
gouessej

0

Ви можете користуватися jquery-rss або RSS Vanilla , який постачається з приємними шаблонами і дуже простий у використанні:

// 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, який робить велику роботу з розбору та відображення RSS та Atom каналів через jQuery Feed API . Щодо основного RSS-каналу на основі XML, я виявив, що він працює як шарм і не потребує сценаріїв на стороні сервера чи інших способів вирішення CORS, щоб він міг працювати навіть локально.


0

Мене так роздратувало багато оманливих статей та відповідей, що я написав власний RSS-читач: https://gouessej.wordpress.com/2020/06/28/comment-creer-un-lecteur-rss-en-javascript-how- to-create-a-rss-reader-in-javascript /

Ви можете використовувати запити AJAX для отримання RSS-файлів, але він буде працювати лише тоді, коли ви використовуєте проксі-сервер CORS. Я спробую написати власний проксі-сервер CORS, щоб отримати більш надійне рішення. Тим часом це працює, я розгорнув його на своєму сервері під Debian Linux.

У моєму рішенні не використовується JQuery, я використовую лише звичайні стандартні API Javascript без сторонніх бібліотек, і він повинен працювати навіть з Microsoft Internet Explorer 11.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.