王座戦ブログの最新エントリのタイトルを抽出する。あとjsdoitとか

 昨日に引き続き、『PHP Simple HTML DOM Parser』(以前のエントリではPerserが抜けていました! スイマセン!)スクレイピングの練習をしていきます。

 再び王座戦ブログを題材にさせていただいて、今度は最新エントリのタイトルを抽出する練習をしてみました。地味ですが、アンテナ風のサイトを作るには、絶対に必要な技術です。

 まず、ライブラリの読み込み、それからWebサイトのURLを入力してサイトをオブジェクト化します。

  include_once('simplehtmldom_1_5/simple_html_dom.php');
	
  $html = file_get_html('http://kifulog.shogi.or.jp/ouza/');

 スクレイピングをするには、まずサイトのHTML構造を把握しておかなければいけません。昨日はとりあえずアンカー要素を全部抜き出して、URLのなかにimagesという語句を含むものを選んでいましたが、そんなものは邪道も邪道。本来は、構造を知らなければなりません。

 王座戦ブログの構造をつぶさに見たところ(といっても、GoogleChromeではF12を押すだけで開発者ツールが使えるので簡単です。今ではついてないブラウザのほうが珍しいか?)、王座戦のエントリのタイトルは「entry」というクラスのdiv要素に、h3要素があり、さらにa要素があってそこにタイトルが記載されているという構造です。とすれば、エントリのタイトルを取得するにはこう書けばよいのです。

  $title = $html->find('.entry h3 a text');

 見ての通り、cssセレクタと同じ感覚で要素を取得することが出来ます。しかしココで一つ問題が。一つのページにはいくつもエントリがあるので、これではページの中にある全てのエントリのタイトルを拾ってきてしまいます。ここで欲しいのは最新のものだけですから、ほんの少し改良してやる必要があります。

  $title = $html->fing('.entry h3 a text',0);

 つまり拾ってきたタイトルの配列のうち、先頭のものだけ返すということです。実際にはブログの先頭にあるエントリが必ず最新とは限りませんが、ここではいいでしょう。

 さあ、これでタイトルを取得することができました! 表示させて見ましょう。

  echo $title;

 出力結果:
 『隨ャ�募ア縺ッ10譛21譌・�域怦�峨↓蟇セ螻』

 ……文字コードのことを考慮するのを忘れていました。これは王座戦ブログがutf-8で記載されているのに対し、コマンドラインshift_jisでデコードしてしまうのが問題なのだと思われます。

 明日は、php文字コード変換をする方法を調べてみるつもりです(ちなみにサーバー上でエンコードutf-8にしたうえで表示すればちゃんとみれますが、複数サイトのエントリを引っ張ってくる場合、文字コードが統一されているとは限りませんので、やはりやっておいたほうがいいのです)。


今日のJsdoit