前提
PHPを使ってスクレイピングする必要があった。
導入が簡単そうなphpQueryを利用することにした。
なんかjQueryぽく書けるし敷居が低い気がしたんですよ。
$dom = phpQuery::newDocument($html);
$hoge = $dom['.hoge table'];
foreach ($hoge->find('tr') as $tr) {
echo trim(pq($tr)->find('td')->text());
}
現象
サンプル通りに書いたら、某サイトだけ文字化けした。HTML見たら
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" />
だったので文字コード変換した。
$dom = phpQuery::newDocument(mb_convert_encoding($html, 'HTML-ENTITIES', 'EUC-JP'));
よし文字化け直っ...あれ、数字(半角)だけ取得できてない。なにそれ。
解決方法
ググっても全然わからなかったのでPHPくわしいひとにきいた。
「全半角混ぜるな危険」との事だったので、混ぜないようにした。
$html = mb_convert_kana($html, "N", 'EUC-JP');
$dom = phpQuery::newDocument(mb_convert_encoding($html, 'HTML-ENTITIES', 'EUC-JP'));
$hoge = $dom['.hoge table'];
foreach ($hoge->find('tr') as $tr) {
$text = trim(pq($tr)->find('td')->text());
echo mb_convert_kana($text, "n");
}
kwsk
$html = mb_convert_kana($html, "N", 'EUC-JP');
ここで半角数字を全角にする。
mb_convert_kana($text, "n");
ここで全角数字を半角にする。
これで無事、「100万畳」みたいな文字が取得できた。
Q.もとの要素に全角数字があったら?
A.半角になります。文句あるか。
原因
開発環境(codeanywhere PHP 5.4.36)だと発生しなくて、本番環境(lolipopサーバー PHP 5.5.35)だと発生した。
深追いしたくないので調べてない。