Posts Tagged RSS
ニコニコ動画のRSS解析
RSSを使ったバージョンのランキング取得スクリプト作成について。
まず、URL引数rssの値を1.0、2.0またはatomとすることで、それぞれRSS1.0、RSS2.0、Atom形式のRSSが出力できるようだ。
しかし、RSS1.0とAtomについては、ランキング2ページ以降でXMLパースエラーが出てしまう。IE、FireFoxで試したが、どちらもうまくいかなかった。整形式のXML文書じゃないらしい。整形式なのはRSS2.0のみなので、これを解析対象とすることにした。
HTTPRequestで取得したドキュメントからSimpleXMLオブジェクトを作成し、そこからデータを取り出して表示する。おそらく、HTMLスクレイピングクラスを用いた方法より高速に処理できる。
解析の際に苦労した点。
それぞれの動画情報のdescriptionブロックの内容はCDATA形式で、HTMLマークアップされたデータが入っているのだが、CDATAセクションは、つまりそのセクションがパーサにXMLマークアップではなくテキストとして処理されることを求めているため、その中のタグをそのままDOMで扱うことはできない。この中の要素にアクセスするためには、この文字列からDOMオブジェクトを生成しなければならない。
そこで、内容をそのままSimpleXMLオブジェクトやDOMDocumentオブジェクトに流し込んだのだが、パースエラーが出てうまくいかない。
長時間の試行錯誤の後、原因らしきものを見つけた。
まず、整形式のXML文書には、文書全体を括るタグが必要であること。<description></description>で囲うことにより解決した。というか、これはまさに基礎事項。
次に、文書内テキストの’&’がエンティティ化されていないこと。ブラウザではうまく表示されるが、XMLパーサでは許されないようだ。
これは、文書をSimpleXMLElementに流し込む前に、preg_replace(‘/&([^#])/’, ‘&$1′, 文字列)で置き換えることで対処できた。ただし、’&’の後に’#'の来ないものを置き換えるようにしているので、たとえば” ”等があると”&nbsp;”と置換され、おかしくなってしまう。
面倒だが、厳密な置き換えを行うよう改良する必要がありそうだ。それとも、HTMLとして読み込めばうまく解釈してくれるのだろうか。
ニコ動のRSS
http://d.hatena.ne.jp/hayori/20080319/1205883717
今頃になって知った。
これあったらわざわざHTMLからデータ取る必要無いじゃん・・・ずいぶん無駄な事をしてた。
DOMとか PEAR
RSSの処理をしたかったのでまず手軽にJavaScriptで試そうとしたら、他ドメインへのHTTPリクエストは禁止のようで断念。まあ当然か。PHPでやる方針に変更。
PEARのHTTP_Requestパッケージを使えばファイルの取得が簡単そうだからさっそくやってみようとしたが、サーバにPEARが入ってなかったようで。
調べた挙句、yumでphp-pearパッケージをインストールすればいいっぽいことが判明。早速入れてみた。
それから、動作テストに何度も失敗しつつ、なんか色々手探りで、pearのHTTP_Requestパッケージをインストール。
# pear install HTTP_Request
他にDOM関数を使うためにphp-xmlモジュールが必要とのこと。本来標準で入ってるらしいが、CentOS標準のパッケージの場合は入っていないらしい。なのでインストール。
# yum install php-xml
この後Apacheをリロードしたらようやく使えるようになった。