JavaScript를 사용하여 RSS 피드를 구문 분석하는 방법은 무엇입니까?


116

RSS 피드 (XML 버전 2.0)를 구문 분석하고 구문 분석 된 세부 정보를 HTML 페이지에 표시해야합니다.


12
1) 정확히 무엇 을 시도 했습니까? 2) 정확히 무엇 을 구문 분석하고 싶습니까? (피드에서 어떤 정보를 추출 하시겠습니까?) 3) 페이지에서 정확히 어디에 표시 하시겠습니까? 4) HTML 마크 업은 정확히 무엇입니까 ? 그것보다 우리 모두는 우리가 David Copperfield 인 척하는 것을 좋아하지만, 우리가 청중을 오랫동안 속일 것이라고 확신하지는 않습니다.
haylem

아니요. 연속 피드가 있습니다. 게시 할 수 없습니다. 내가 여기에 샘플을 넣어 왜 그게
티루

좋아,하지만 그것은 샘플이 아닙니다. 존재하지 않는 페이지의 URL 일뿐입니다. 이 경우 내 대답에는 "샘플"이 있습니다. FEED_URL 변수입니다. 필요한 것을 거기에 넣으십시오. 더 많은 도움이 필요한 경우 필요한 피드 요소, HTMK 스텁의 모양, 생성 된 HTML 스텁을 삽입 할 위치에 대한 자세한 정보를 제공해야하며 실제 샘플도 제공 할 수 있습니다. RSS 피드 (발췌 부분을 복사하고 실제 콘텐츠를 자리 표시 자로 대체).
haylem

답변:


216

피드 구문 분석

jQuery를jFeed

(그것을 실제로 권장하지 말고 다른 옵션을 참조하십시오.)

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

jQuery를 내장 s의 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());
    });
});

jQuery를 하고 구글 AJAX 피드 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>

실행

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
답변 Haylem에 감사드립니다. 그러나 나는 이것에 대한 출력을 얻지 못했습니다. 자바 스크립트로 가능합니까?
Thiru

1
@Thiru : 방금이 질문의 RSS 피드 ( stackoverflow.com/feeds/question/10943544 )로 마지막 방법을 시도했는데 잘 작동했습니다.
haylem

8
여기에 전체 작업 코드 조각이있을 수 있습니다. 나머지는 스스로 해결할 수 있다고 확신합니다.
haylem

2
@Timmy : 뭐하는거야? 당신은 Thiru의 친구입니까? 유사한 문제보고 기술이 있습니다. 마지막 2 개의 코드 조각을 콘솔에 복사하여 붙여넣고 실행하여 예상대로 출력을 얻었습니다. 어떤 자원을 위해 무엇을 어떻게 했습니까?
haylem 2014 년

2
Google AJAX API는 더 이상 사용되지 않습니다. 2017 년 1 월 이후로는 사용할 수 없습니다.
Ezee

39

더 이상 사용되지 않는 또 다른 (@daylight 덕분에) 옵션이며 나에게 가장 쉬운 옵션입니다 (이는 SpokenToday.info에 사용하는 것입니다 ).

JQuery를 사용하지 않고 2 단계 만 있는 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
Google Feed API는 더 이상 사용되지 않으며 2015 년 12 월 2 일부로 더 이상 작동하지 않습니다. Bummer
raddevus 2015

해당 코드를 기반으로 피드 URL을 입력하라는 메시지를 추가 한 다음 원하는 RSS 피드를 구문 분석하기 위해 값을 포함하도록 속성을 연결할 수 있습니까? 예를 들어 여러 이미지를 처리하는 경우 문자열과 값을 연결할 수 있습니다.document.getElementById('image').style.backgroundImage = "url('" + src + "')";
noobninja

2
Google AJAX API는 더 이상 사용되지 않습니다. 2017 년 1 월부터 사용할 수 없습니다
Ezee

7
누구든지 Google API가 다운되었으므로 적절한 대안을 알고 있습니까?
duellsy

3

RSS 위젯에 대한 Google 피드 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 피드를 도메인 간 요청할 수 없습니다.

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 피드를 구문 분석하고 javascript가 최종 대상 피드 자체에 액세스하는 대신 내 PHP에 액세스하도록 허용하는 것입니다.


1

일반 자바 스크립트 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'))

인용 한 기사의 예는 그대로 작동하지 않습니다. CORS 프록시를 사용하여 작동하도록하려면 rss.js의 15 및 26 행을 수정해야합니다. 그렇지 않은 경우 동일한 출처 정책으로 인해 오류가 발생합니다. 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와 - RSS 또는 바닐라 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

이에 대한 좋은 해결책을 찾으려고 노력하면서 , jQuery Feed API 를 통해 RSS 및 Atom 피드를 구문 분석하고 표시하는 훌륭한 작업을 수행하는 FeedEk jQuery RSS / ATOM 피드 플러그인을 발견 했습니다 . 기본 XML 기반 RSS 피드의 경우 매력적으로 작동하며 로컬에서도 실행하기 위해 서버 측 스크립트 나 기타 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를 사용하지 않고 타사 라이브러리가없는 일반 Javascript 표준 API 만 사용하며 Microsoft Internet Explorer 11에서도 작동해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.