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として読み込めばうまく解釈してくれるのだろうか。