PHP
phpQuery

phpQueryで数字が消えたとき

More than 1 year has passed since last update.

前提

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)だと発生した。
深追いしたくないので調べてない。