質問: 使えていた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をクラス指定で取れていたものが、サーバーを変えると上記のエラーを吐き出すのか、可能性を幾つか教えて頂けますと幸いです。
回答: なにやら解決したそうなので、コメントでのやり取りを整理して、回答に代えます。 まず、最初に疑ったのが環境が変わったということで、そもそもページの内容が取れてないんじゃないかということ。 > 可能性の話として、外のページが取れてないんじゃないでしょうか。 > そもそも外に出られないとか、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