使えていたsimple_html_dom.php がさくらの共用からGMOクラウドVPSに移行するとエラーを吐き出す原因は何でしょうか。


PHPのバージョンはさくらの共用は5.4.xのサーバーから、GMOクラウドVPSの5.4.16のサーバーにファイルを移行すると、今まで取得できていたスクレイピング部分がどれも取れなくなってしまいました。

$dom->find('.classname',0)->innertext;
等でさくらインターネットでは今も問題なく動いているものですが、GMOクラウドでは
Notice: Trying to get property of non-object
というエラーで全ての指定箇所が同じエラーで取得できていないようでした。
$domをダンプすると大量の階層構造が吐き出されますので、DOMの取得はできてそうです。

そもそもクラウドとは言えサーバーを設定した事が無いので初歩的な事が原因かもしれません。

pearもインストールされていなくてエラーが出ていたのでインストールしてパスを通すとpearのエラーはなくなりました。
エラーレベルやCGIモードか、Apacheかなども変えてみましたが改善せず、元に戻しました。

なぜ共用サーバーではHTMLをクラス指定で取れていたものが、サーバーを変えると上記のエラーを吐き出すのか、可能性を幾つか教えて頂けますと幸いです。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2016/08/30 16:44:26
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント500pt

なにやら解決したそうなので、コメントでのやり取りを整理して、回答に代えます。


まず、最初に疑ったのが環境が変わったということで、そもそもページの内容が取れてないんじゃないかということ。

可能性の話として、外のページが取れてないんじゃないでしょうか。
そもそも外に出られないとか、UA や経路で 403 Forbidden なページが返されているとか。
$dom->plaintext で、ページの中身を確認した方が良いと思います。


$dom->plaintext の内容は、正しく取得できているらしいとのことだったので、次に疑ったのは、こんなところ。

  • Simple HTML DOM のバージョンや、それに依存するライブラリのバージョン(というほど、複雑なライブラリじゃない)
  • パースに失敗している

言語は違いますが、Ruby の 1.6 → 2.0 をやったことがあって(また、バージョンの差が激しいんだ)、内部コードのデフォルトが Unicode になったために、そもそもパースする手前でこけてるような経験をしたことがあるから。

エンコード変えたら出来ました、ありがとうございます!

ということでした。
php.ini で encoding を変えたんだろうか。


ちなみに、こんなことを書いている人もいたので、覚えておくと使える場面があるかも。

Simple HTML DOMで、外部のファイルを扱う場合、

// Create DOM from URL or file
$html = file_get_html('http://www.google.com/');

と書くことが多い。

でも日本語サイトの場合は、文字化けする可能性が高いので、

mb_language('Japanese');

$source = file_get_contents('http://www.google.com/');
$source = mb_convert_encoding($source, 'utf8', 'auto');

$dom = str_get_html($source);

とやった方がいい。

PHP Simple HTML DOM Parserで文字化けするときの対処法 - Qiita
  • id:a-kuma3
    可能性の話として、外のページが取れてないんじゃないでしょうか。
    そもそも外に出られないとか、UA や経路で 403 Forbidden なページが返されているとか。
    $dom->plaintext で、ページの中身を確認した方が良いと思います。
  • id:iori753
    ありがとうございます。
    $dom->plaintext では全てのテキストがしっかり取れているように見えました。
    しかし、$dom->find('.post-title',0)等の指定箇所が10個程ありますが、別のサーバーでは取れていますが、GMOクラウドの写したばかりの設定ですとすべての箇所がNotice: Trying to get property of non-object となってしまいます。
  • id:a-kuma3
    $dom->find('.post-title') はダンプすると空の配列だったりするんですよね、きっと。
    find のセレクタをタグに変えて切り出せるかどうか試してみるとか。
    後は、日本語のエンコードまわり。
  • id:iori753
    エンコード変えたら出来ました、ありがとうございます!
    回答に記載お願い致します。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません