LoginSignup
0
0

More than 5 years have passed since last update.

phpQueryで数字が消えたとき

Last updated at Posted at 2016-07-10

前提

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0