PHP Simple HTML DOM ParserでWikipediaをスクレイピングしてみる

# やろうと思ったこと
Wikipediaで文字の説明を読んでいると、
それぞれの文字体系の「親」となった文字体系の説明がある。
例えば、アラビア文字の「親」はナバテア文字なんだそうだ。

この部分の記事の記述はだいたいどの文字体系についても同じ書式になっているようなので、
これをスクレイピングでとってみることにする。

# コード
```php:
<?php
require_once 'simple_html_dom.php';

//$str_child_systemの「親の文字体系」をWikipediaから取得する。
function str_parent_system($str_child_system){
	$str_result='error';

	//Wikipediaの内容を文字列に入れる。
	$url='http://ja.wikipedia.org/wiki/';
	$url.=urlencode($str_child_system);
	$str_html=file_get_contents($url);
	if(!$str_html){
		return('not found');
	}

	//simple_html_domオブジェクトを生成する。
	$obj_html=str_get_html($str_html);

	//classがinfoboxのtableを取り出す。
	$array_obj_infobox=$obj_html->find('table[class="infobox"]');
	if(count($array_obj_infobox)>0){
		//tableの中のtrを全て取り出す。
		$array_obj_tr=$array_obj_infobox[0]->find('tr');
		//「親の文字体系」が書かれているtrをみつけて、そのtdを取り出す。
		foreach($array_obj_tr as $tr){
			$array_obj_th=$tr->find('th');
			if(count($array_obj_th)>0){
				if(strstr($array_obj_th[0]->innertext,'親の文字体系')){
					$array_obj_td=$tr->find('td');
					//みつけたtdの中のaを全て取り出す。
					$array_obj_a=$array_obj_td[0]->find('a');		
					foreach($array_obj_a as $a){
						//最後のaのinnertextが欲しい文字列なのでこれを取り出す。
						$str_result=$a->innertext;
					}
				}
			}
		}
	}
	
	$obj_html->clear();
	return($str_result);
}

//標準入力から一行ずつ文字体系を読み込み、その親の文字体系を求めて出力する。
while(!feof(STDIN)){
	$line=trim(fgets(STDIN));
	if($line!==''){
		printf("%s <- %s\n",$line,str_parent_system($line));
	}
}
?>
```
# 入力の準備
[WikipediaのAPIをPHPから叩いてみる](http://qiita.com/yasu_kobayashi/items/687b092b751afb4c58e5)で取得した
記事タイトル97件のうち、
「アブジャド」「原シナイ文字から派生した文字体系」「日本語の表記体系」は文字体系ではないので、手作業で除き、
タイトルと記事のURLが一致しない3件「バイバイン_(文字)」「アース_(文字)」「仮名_(文字)」を手でなおして、
94件の文字体系のリストを作る。

これを上記のコードの標準入力に与えて、出力を見る。

# 実行結果
```
フェニキア文字 <- 原カナン文字
ソグド文字 <- シリア文字
サマリア文字 <- 古ヘブライ文字
片仮名 <- 借字
国際音声記号 <- フォノタイピック記号
平仮名 <- 借字
バタク文字 <- 英語版
ナバテア文字 <- シリア文字
南アラビア文字 <- 原シナイ文字
ラテン文字 <- エトルリア文字
キリル文字 <- グラゴル文字
注音符号 <- 漢字
線文字B <- 線文字A
万葉仮名 <- 漢字
エトルリア文字 <- クマエ文字
アヴェスター文字 <- パフラヴィー文字
古ヘブライ文字 <- フェニキア文字
ウルドゥー文字 <- ペルシア文字
ジャウィ文字 <- アラビア文字
ペルシア文字 <- アラビア文字
アラム文字 <- フェニキア文字
シリア文字 <- アラム文字
バリ文字 <- 英語版
マンダ文字 <- アラム文字
ウイグル文字 <- ソグド文字
アルメニア文字 <- ギリシア文字
ティフィナグ文字 <- フェニキア文字
グルジア文字 <- ギリシャ文字
レプチャ文字 <- チベット文字
ゴート文字 <- ルーン文字
ギリシア文字 <- フェニキア文字
原カナン文字 <- 原シナイ文字
グプタ文字 <- ブラーフミー文字
チュノム <- 漢字
古イタリア文字 <- クマエ文字
バイバイン_(文字) <- 英語版
デモティック <- ヒエラティック
ルーン文字 <- 古イタリア文字
グラゴル文字 <- ギリシア文字
女真文字 <- 漢字
突厥文字 <- ソグド文字
ソヨンボ文字 <- Ranjana
ラーオ文字 <- スコータイ文字
ゲエズ文字 <- 南アラビア文字
ゲール文字 <- インシュラー体
楔形文字 <- error
シャームキー文字 <- ペルシア文字
コプト文字 <- デモティック
満州文字 <- モンゴル文字
カナダ先住民文字 <- ピットマン式速記
トンパ文字 <- error
ブラーフミー文字 <- [1]
ウガリット文字 <- 楔形文字
タイ文字 <- クメール文字
パフラヴィー文字 <- アラム文字
ベンガル文字 <- 東ナーガリー文字
クメール文字 <- ノート
ターナ文字 <- インド数字
アース_(文字) <- <span title="この記述には信頼できる情報源の提示が求められています。（2007年7月）">要出典</span>
デーヴァナーガリー <- ナーガリー文字
ヘブライ文字 <- アラム文字
ヒエログリフ <- error
メロエ文字 <- エジプト民衆書体
仮名_(文字) <- 漢字
チベット文字 <- シッダマートリカー文字
グランタ文字 <- ブラーフミー文字
オリヤー文字 <- ベンガル文字
女書 <- 漢字
阿比留文字 <- error
アラビア文字 <- ナバテア文字
シンハラ文字 <- ブラーフミー文字
グルムキー文字 <- 英語版
漢字 <- error
カローシュティー文字 <- アラム文字
梵字 <- シッダマートリカー文字
琉球古字 <- 甲骨文字
モンゴル文字 <- ウイグル文字
ブリヤート文字 <- モンゴル文字
テングワール <- サラティ
ロロ文字 <- error
タミル文字 <- ブラーフミー文字
マラヤーラム文字 <- グランタ文字
パスパ文字 <- チベット文字
カンナダ文字 <- ブラーフミー文字
ヒエラティック <- エジプトヒエログリフ
グジャラーティー文字 <- デーヴァナーガリー
テルグ文字 <- ブラーフミー文字
ファイストスの円盤 <- error
ロヴァーシュ文字 <- 突厥文字
小児経 <- アラビア文字
ビブロス文字 <- 原カナン文字
キュプロ・ミノア文字 <- 線文字A
インシュラー体 <- ラテン文字
北海道異体文字 <- error
```
# 感想
DOM構造決め打ちで適当に作ったわりには八割ぐらい成功したので、
コンピュータアシステッド手作業としてはまあよしとする。

# 参考にした情報
[PHP初心者がやってみた！スクレイピング入門](http://inimoni.com/blog/1531/)
[PHP Simple HTML DOM Parserの使用方法](http://so-zou.jp/web-app/tech/programming/php/library/simplehtmldom/)