RSSデータの読み込み方とは?

このQ&Aのポイント
  • RSSデータの読み込み方とは、YahooブログのRSSを取得するための方法やgooやbiglobeブログのRSSを取得する方法を解説します。
  • 記事では、simplexmlという方法を使用して、サクッとすべてのデータを取得する方法や、ajaxを使用せずにPHPで処理する方法について解説します。
  • また、取得方法の違いによる取りこぼしの問題や20件のデータが取得できない状況についても言及します。
回答を見る
  • ベストアンサー

RSSデータの読み込み方を教えてください!

よろしくお願いします...m(_ _)m YahooブログのRSSは、 <?php $xml=simplexml_load_file($yahoo_adrs); for($i=0;$i<=20;$i++){ $title=$xml->channel->item[$i]->title; $title=mb_convert_encoding($title,'SJIS','UTF-8'); } ?> で、タイトル取得が出来ますが、 goo、biglobeブログのRSSは、この方法でも読み込んでくれません。 今は、下記のようなコードで読み込んでます。 $fp=fopen($goo_adrs,'r'); $result=stream_get_contents($fp); fclose($fp); $parser=xml_parser_create('UTF-8'); xml_parse_into_struct($parser,$result,$value,$index); foreach($value as $a){ foreach($a as $b =>$keyb){ if($b=="tag"){ $sw=0; } if($b=="tag" AND $keyb=="TITLE"){ $sw=1; } if($sw==1 AND $b=="value"){ $title=$keyb; } } } この方法は、取りこぼしがある為、 20件のデータが10件だったり15件だったりして不便です。 simplexmlのような方式で、サクッと全部取得できて、 簡単な方法はないでしょうか? ajaxは勉強を始めたばかりで、使えません。 PHPで何とか処理したいと考えてます。 ご指導、よろしくお願いします。 m(_ _)m 現在、下記のブログで利用しています。 http://maybis.sitemix.jp/blog/

  • PHP
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • hyoro
  • ベストアンサー率71% (5/7)
回答No.1

「Magpie RSS - PHP RSS Parser」を利用してみてはいかがでしょうか。 参考URLに日本語解説があります。

参考URL:
http://www.hyuki.com/yukiwiki/wiki.cgi?MagpieRSS
dohdekka
質問者

お礼

この度はありがとうございます。m(_ _)m 参考urlを拝見しました。 スクリプトが豊富で勉強になります。 早速、利用してみましたが、何のリターンもありません。  中身では、SNOOPYを利用しているので、  検索してダウンロードしました。  開発者からは、php.iniのディレクトリー云々とありありますが、  検索すると、include_onceするだけで簡単とも書いてあります。 参考文献の事例が少ないので、このスクリプトを参考に、 改良して行こうと思います。 検索できるほど豊富な知識がなかったで大変参考になりました。 ありがとうございました。  m(_ _)m

その他の回答 (1)

  • mpx
  • ベストアンサー率71% (149/209)
回答No.2

>> simplexmlのような方式で、サクッと全部取得できて、 >> 簡単な方法はないでしょうか? オブジェクトの構造違いを吸収するようにソフトを組めば simplexmlでも問題ないと思います。 dohdekkaが例示したコードを修正すると下記 <?php $xml=simplexml_load_file($yahoo_adrs); for($i=0;$i<=20;$i++){ if (isset($xml->channel->item[$i]->title)){ $title=$xml->channel->item[$i]->title; } else { $title=$xml->item[$i]->title; } $title=mb_convert_encoding($title,'SJIS','UTF-8'); } ?>

dohdekka
質問者

お礼

アドバイスありがとうございます...m(_ _)m 誤解を招く質問をしてしまったようです。 simplexmlで読み込めるYahooRSSは、 私も大体このような方法で取得しています。 質問をするときに一部コードを省略してしまいました。 スミマセン.... simplexmlで、Yahoo以外のブログのRSSを読み込むみ、 $xml(simplexmlの構造体)のvar_dumpをとってみると、 Array(False)が返ってきた様な覚えがあります。 原因が分らないですが、YahooブログのRSS と他のブログのRSSは、見た目以上に構造が違うようです... $fp=fopen($goo_adrs,'r'); $result=stream_get_contents($fp); fclose($fp); $parser=xml_parser_create('UTF-8'); xml_parse_into_struct($parser,$result,$value,$index); foreach($value as $a){ foreach($a as $b =>$keyb){ if($b=="tag"){ $sw=0; } if($b=="tag" AND $keyb=="TITLE"){ $sw=1; } if($sw==1 AND $b=="value"){ $title=$keyb; } } } この方法は、Yahoo以外のブログのほとんどは読み込み可能ですが、 もうちょっとスマートに行かないかなぁ..と、思いまして、 お尋ねいたしました。 只今、Magpie RSS - PHP RSS Parserを分析中です。 snoopyの置き場を何処に置けばリターンが正常に返ってくるのか、 検討中です。 フラグを立ててカウントしながらという、力技を使わないで、 せめてforeach文のネスト構造で取得できたりしたらと、問い合わせをさせて頂きました。 Magpie RSS 自体複雑なので、簡単な方法はないのではないか... ならば、今の方法でも良いのではないかと思っています。 ご意見、真にありがとうございました。 m(_ _)m

関連するQ&A

  • simplexml_load_fileを使用してblogのRSSを読み

    simplexml_load_fileを使用してblogのRSSを読み込み、ページ内に表示させたいのですが 下記のスクリプトでは楽天とlivedoorのRSSの読み込みが出来ません。 色々検索してみたのですがこれといった解決法を発見できなかったので質問させていただきます。 どうぞよろしくお願いいたします。 <?php $xml = simplexml_load_file('RSSをここに入力'); $i = 0; foreach($xml->channel->item as $item) { if(++$i>5) break; $title = (string)$item->title ; $link = (string)$item->link ; echo ("<li><a href=".$link.">".$title."</a></li><br />"); } ?>

    • ベストアンサー
    • PHP
  • RSSのXMLロードで失敗してしまう

    RSSのデータを取得する、という処理を行いたいのですが、 文字コードの件でひっかかってしまっているようで なかなか前に進むことができません。 ************ // RSSの内容を取得する $rss_text = file_get_contents(※RSSのフィードURL); // RSSの文字エンコーディングを変換→再変換 $rss_text = mb_convert_encoding($rss_text, 'SJIS', 'UTF-8'); $rss_text = mb_convert_encoding($rss_text, 'UTF-8', 'SJIS'); $rss_text = preg_replace('/[\x00-\x1f]/', '', $rss_text); // RSSをパースする $rss_xml = new SimpleXMLElement($rss_text); if ($rss_xml) { // XML解析に成功した場合 // SimpleXMLElementオブジェクトからデータを取得 $items = $rss_xml->item; foreach($items as $item) { echo 'ID:'. $item->guid. '<br />'; echo 'リンク:'. $item->link. '<br />'; echo '日付:'. $item->pubDate. '<br />'; echo 'タイトル:'. $item->title. '<br />'; echo '本文:'. $item->description. '<br />'; } } ************ こういったコードを組んでいるのですが、現状では Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : attributes construct error in... Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in... Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Couldn't find end of Start Tag rss line 1 in... Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in... Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : Extra content at the end of the document in... Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in... このようなエラーが表示されてしまいます。 自分なりに文字コードを処理しているつもりではあるのですが、 他にも何かしなければならないことがあるのでしょうか? どうぞ知恵を貸していただければと思います。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP4でのXMLデータの取り扱い

    Webサービスを利用してXMLデータを取得するスクリプトをPHPで書いています。レンタルサーバの関係でバージョンは4.4.4しか使えません。 XMLを扱う関数というと、PHP5ではsimpleXMLやXMLReaderなどがあるようで、各要素へアクセスするにも $xml=simplexml_load_file('books.xml'); foreach($xml->book as $book){ .... という感じでオブジェクトとしてアクセスできるようですが、こういうのをPHP4で実現する方法はないのでしょうか?例えば入れ子になったデータだと、深い階層にたどりつくために foreach($results as $key => $value){ foreach($value $key2 => $value2){ foreach($value $key3 => $value3){ ... } } } みたいな感じで書いているのですが、まったくスマートではないですし、なにか間違っているような気がします。良い方法があればお教えください。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 自分のHPにRSSを表示させたい

    試しに、h●●p://www.okinawainfo.net/rss10.xmlを表示させたく htdocs内のrss.phpファイルに <dl> <?php $rss = simplexml_load_file("h●●p://www.okinawainfo.net/rss10.xml"); $i = 0; foreach ($rss->channel->item as $item) { if( $i++ == 5 ) { break; } $link = $item->link; $title = $item->title; $date = date('Y.m.d', strtotime($item->pubDate)); $desc =$item->description; echo '<dt>' . $date . '</dt>'; echo '<dd><a href="' . $link . '" target="_blank">' . $title . '</a></dd>'; } ?> </dl> と、打ち込みました。 ですが、エラーが出ます。 エラーは… Object not found! 要求された URL は本サーバでは見つかりませんでした。 もし手入力で URL を入力した場合は、綴りを確認して再度お試し下さい。 サーバーの障害と思われる場合は、ウェブ管理者までご連絡ください。 Error 404 localhost 2011/12/09 4:19:28 Apache/2.2.17 (Win32) mod_ssl/2.2.17 OpenSSL/0.9.8o PHP/5.3.4 mod_perl/2.0.4 Perl/v5.10.1 ↑と出ます。 何故でしょうか><

  • xml rssの更新の有無をphpで取得するには

    おはようございます。朝早くから質問させていただきます。 他サイトやブログで公開されているrssフィードなどで、タイトルを取得し、公開するいわゆるアンテナサイトというものがありますが あのようなサイトはどうやって更新されたことを調べているのでしょうか? つまり、phpのsimplexmlではこちら側(後、A)からxmlファイルを取りにいくだけであり、相手側(後、B)が更新したのち、Aサイトのスクリプトを実行して、xmlフィードを取りに行き、Aサイトを更新するということになると思うのですが、ちらほらとみかけるアンテナサイトなどでは、Bブログが更新されるのとほぼ同時に、Aサイト側にもBブログで更新された記事のタイトルが羅列されております。 このようなライブラリやスクリプト、もしくは関数、またはその方法などが存在するのなら教えていただけないでしょうか?よろしくお願いします。

    • ベストアンサー
    • PHP
  • RSSリーダーに表示させないようにするには?

    FC2でブログをやろうと思うのですが、RSSリーダーに表示させないように出来ますでしょうか。 素人考えでスキンの <link rel="alternate" type="application/rss+xml" href="<%url>?xml" title="rss"> っていう部分を削除してみました。 一応私のリーダーには表示されてないみたいですけど、これで大丈夫でしょうか? わかる方がいたらよろしくお願いします。

  • simplexml_load_file() のかわりの simplexml_load_string() がエラーになる

    こんにちわ。 お時間あるかた、どうぞよろしくおねがいします。 現在、RSSを読み込んで、色々な処理をしたいと思っています。 そして、下記のコードを書いたところうまくいきました。 $root = simplexml_load_file($url); ところが、使っているレンタルサーバでは PHP.iniのallow_url_fopenをONにすることが禁止されていることを知ったので、 simplexml_load_string()を使うように、プログラムを書き換えました。(下記抜粋) $response = http($url . $parm); $line = explode("\n" , $response); // HTTPヘッダを消す for ( $i=0 ; $i < 100 ; $i++ ) if ( $line[$i] == "" ) break; // HTTPボディーだけ取得 $xml_str = ""; for ( $i++ ; $i < count($line) ; $i++ ) $xml_str .= $line[$i]; $root = simplexml_load_string($xml_str); こうしたところ、一部のRSSで、Error while parsing the documentが出るようになってしまいました。 いくつか試したところ、amebloのフィードはOKなのですが、他のRSSだとエラーになるようです。 $ret = get_rss("http://feedblog.ameba.jp/rss/ameblo/femiohji"); // OK $ret = get_rss("http://pub.ne.jp/marunohi/?action=rss&type=rss1.0"); // NG というわけで、 simplexml_load_file()のときは動いていたのですが、 simplexml_load_string()にしたらエラーになります。 原因がわからず、行き詰まってしまいました。 よろしくおねがいいたします。

    • ベストアンサー
    • PHP
  • simplexml_load_fileについて

    お世話になります。 simplexml_load_fileについて質問です。 下記のようなコードでライブドアブログのRSSを解析しようとしております。 ブログ記事の全文を取得したいのですが、一部分しか取得することが出来ません アドバイスをお願いします。 宜しくお願いします ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// $rss = $data['blog_rss']; $xml = @simplexml_load_file($rss,'SimpleXMLElement', LIBXML_NOCDATA); #ブログタイトル $data['xml']['title'] = $xml->channel->title; #ブログ説明 $data['xml']['description'] = $xml->channel->description; #最大件数 $max_lines = 8; $i=0; foreach ($xml->item as $item) { $ns = $item->getNamespaces(true); $date = $item->children($ns["dc"]); //記事のリンク先 $data['xml']['kiji'][$i]['link'] = $item->link; //記事の見出し $data['xml']['kiji'][$i]['title'] = $item->title; //記事の日付 $pubDate = $date->date; $data['xml']['kiji'][$i]['pubDate'] = date("Y年m月d日 H:i:s", strtotime($pubDate)); //記事本文 $desc = $item->description; $data['xml']['kiji'][$i]['desc'] = $desc; $i++; //最大件数に達したときストップ if ($i == $max_lines) break; }

    • 締切済み
    • PHP
  • RSSに関して

    こんばんは。お世話になっております。 只今、テスト的に以下のサイトのソースを参考に、登録していただいた方のブログの一覧表示(更新題名が1件ずつ)が出来るように組んでいるのですが、非常に重たく、他に上手いやり方がある?などと色々と試行錯誤を繰り返している状況です。 http://works.xrea.jp/headline.php イメージ的に、登録してくれた会員のブログを、ブログランキングサイトのように、検索一覧として1件ずつ更新記事(題名)を表示させたいと考えてます。 ソースの流れは、 while($row = mysql_fetch_array($res, MYSQL_ASSOC)){  $url = $row["url"];  require("./rss_index/rss-test.php");  ・  ・ 以上、検索ファイル 以下、rss-test.php <?php require_once 'rss_fetch.inc'; $url = $url; $rss = fetch_rss($url); $title = $rss->channel['title']; $title = mb_convert_encoding($title, "EUC-JP", "auto"); echo "<h5>$title</h5>\n"; $rss->items = array_slice($rss->items, 0, 1); foreach ($rss->items as $item ) { $title = $item[title]; $title = mb_convert_encoding($title, "EUC-JP", "auto"); $url = $item[link]; echo "<li><a href=\"$url\">$title</a></li>\n"; } ?> 以上、お忙しい中恐縮ですが、ご指摘も含めアドバイスなど頂けたら幸いです。宜しくお願い致します。

    • ベストアンサー
    • PHP
  • simplexml_load_fileについて

    simplexml_load_fileでrssを読み込んでいるのですが、 rssのxmlファイルが少し特殊でリンクが抜けているitemがあり、 以降ずれ込んで読まれてしまい困っています。 ■xml例 <root> <item> <title></title> <link></link> </item> <item> <title></title> <link></link> </item> <item> <title></title> ←リンクがぬけている </item> <item> <title></title> <link></link> </item> </root> ■php側 抜粋/割愛 $xml = simplexml_load_file($this->xmlPath) or die("ファイルが読み込まれません"); //xpathにて各ノードを取得 $title = $xml->xpath(//title); $link = $xml->xpath(//link); for($i = 0; $i < 3; $i++) { <a href="<?=$link[$i]?>"> <?=$title[$i]?> </a> } のように取得して、html加工して 吐き出しているので、linkがないノードがあると 後のものがどんどんずれて読み込まれてしまいます・・・ どのようにしたら解決できますでしょうか・・・

    • 締切済み
    • PHP

専門家に質問してみよう