PHP5.5.10で、以下のサイトを参考にGoutteを試そうとしますがエラーが取れず困っています。

http://d.hatena.ne.jp/hnw/20120115
http://www.buildinsider.net/web/bookphplib100/088

ルートディレクトリにファイルは2つしか入っていません
index.php
goutte.phar

index.phpの中身
>|
<?php
require __DIR__.'/goutte.phar';
use Goutte\Client;

$client = new Client();
$crawler = $client->request('GET', 'http://d.hatena.ne.jp/keyword/%BA%B0%CC%EE%A4%A2%A4%B5%C8%FE');
list(list($title, $url)) = $crawler->filter('div.keyword-container a.title')->extract(array('_text', 'href'));
$furigana = $crawler->filter('div.keyword-container span.furigana')->text();

var_dump($title, $url, $furigana);
?>
|<


以下、質問の続きは文字数の関係で補足に記載します。
よろしくお願いします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2014/08/23 12:56:28
  • 終了:2014/08/28 10:40:51
id:wsapp

質問者から

wsapp2014/08/24 11:37:02

最初、PHP5.3以降を用意するように書かれていたのでPHP5.3.3で試したら

Parse error: syntax error, unexpected '[' in phar:///home/hoge/xxx.net/public_html/goutte.phar/vendor/guzzlehttp/guzzle/src/functions.php on line 20

のエラーが取れませんでした。

で、PHP5.5.10で試すと
Warning: curl_setopt_array(): Array keys must be CURLOPT constants or equivalent integer values in phar:///home/hoge/xxx.net/public_html/goutte.phar/vendor/guzzlehttp/guzzle/src/Adapter/Curl/CurlFactory.php on line 48
Fatal error: Uncaught exception 'InvalidArgumentException' with message 'The current node list is empty.' in phar:///home/hoge/xxx.net/public_html/goutte.phar/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Crawler.php:526 Stack trace: #0 /home/hoge/xxx.net/public_html/index.php(9): Symfony\Component\DomCrawler\Crawler->text() #1 {main} thrown in phar:///home/hoge/xxx.net/public_html/goutte.phar/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler/Crawler.php on line 526


これらはgoutte.phar内部のエラーなんですよね??
にっちもさっちもいかず困っています。
サーバーはレンタルでエックスサーバーです。
よろしくお願いしますm(_ _)m

ベストアンサー

id:sasada No.2

sasada回答回数1482ベストアンサー獲得回数1332014/08/25 19:34:35

ポイント50pt

 コメント欄にある、キーワード「紺野あさ美’」は作成されてないので取得出来ないと思います。
 取得するURLは、質問文にあるURL「http://d.hatena.ne.jp/keyword/%BA%B0%CC%EE%A4%A2%A4%B5%C8%FE」なら通ります。
 その上で、

list(list($title, $url)) = $crawler->filter('div.keyword-container a.title')->extract(array('_text', 'href'));

list(list($title, $url)) = $crawler->filter('section.keyword-container a.title')->extract(array('_text', 'href'));

に書き換えないと上手くいかないようです。(HTMLソースを見た限り)

他1件のコメントを見る
id:sasada

 どうしても気になるのなら、ですが。。。
 下記スクリプトの要領でgoutte.pharからgoutte.phar.tar.gzを作れます。(ファイル名を'myphar.phar'から'goutte.phar'に変えてください)
 これを展開すれば、「phar:///home/hoge/xxx.net/public_html/goutte.phar/vendor/guzzlehttp/guzzle/src/Adapter/Curl/CurlFactory.php on line 48」のソースが見られるので、その意味が分かるかもしれませんね。

phar 形式から tar 形式への phar アーカイブの変換

<?php
 $phar = new Phar('myphar.phar');
 $pgz = $phar->convertToExecutable(Phar::TAR, Phar::GZ); // myphar.phar.tar.gz を作成します
 ?>

http://www.phppro.jp/phpmanual/php/intro.phar.html

2014/08/27 16:06:37
id:wsapp

ありがとうございます。
そんな手があるんですね。
試してみます。

2014/08/28 10:40:36

その他の回答(1件)

id:wsapp

質問者から

wsapp2014/08/23 12:58:10

質問文を編集しました。詳細はこちら

id:kazukichi_0914 No.1

かずきち。回答回数126ベストアンサー獲得回数82014/08/24 12:14:43

ポイント50pt

なんかの変数が空みたいですよ?
このプログラムの途中で変数を変数に格納されようとしていますが、
格納前にprint文をはさんでみてください。
おそらく何かがnullを返してエラーします。

他1件のコメントを見る
id:kazukichi_0914

$crawler = $client->request('GET', 'http://d.hatena.ne.jp/keyword/%BA%B0%CC%EE%A4%A2%A4%B5%C8%FE’);

ここの一文でどうやら正しくGETできていないようです。
僕はあんまりphp使わないんですけど…
GET→_GETって違いますかね?w
エラー行分かりますか?

2014/08/24 19:28:59
id:wsapp

返信ありがとうございます。

モジュール配布先のサンプルコードもGETなので間違いないと思います。
https://github.com/fabpot/goutte

エラー行とはgoutte.pharのですか?
この中身は見る方法が解りません。
それとも、自分のindex.phpでしたら
$crawler = $client->request('GET', 'http://d.hatena.ne.jp/keyword/%BA%B0%CC%EE%A4%A2%A4%B5%C8%FE’);
をコメントアウトするとエラーは消えます。

2014/08/24 19:40:13
id:sasada No.2

sasada回答回数1482ベストアンサー獲得回数1332014/08/25 19:34:35ここでベストアンサー

ポイント50pt

 コメント欄にある、キーワード「紺野あさ美’」は作成されてないので取得出来ないと思います。
 取得するURLは、質問文にあるURL「http://d.hatena.ne.jp/keyword/%BA%B0%CC%EE%A4%A2%A4%B5%C8%FE」なら通ります。
 その上で、

list(list($title, $url)) = $crawler->filter('div.keyword-container a.title')->extract(array('_text', 'href'));

list(list($title, $url)) = $crawler->filter('section.keyword-container a.title')->extract(array('_text', 'href'));

に書き換えないと上手くいかないようです。(HTMLソースを見た限り)

他1件のコメントを見る
id:sasada

 どうしても気になるのなら、ですが。。。
 下記スクリプトの要領でgoutte.pharからgoutte.phar.tar.gzを作れます。(ファイル名を'myphar.phar'から'goutte.phar'に変えてください)
 これを展開すれば、「phar:///home/hoge/xxx.net/public_html/goutte.phar/vendor/guzzlehttp/guzzle/src/Adapter/Curl/CurlFactory.php on line 48」のソースが見られるので、その意味が分かるかもしれませんね。

phar 形式から tar 形式への phar アーカイブの変換

<?php
 $phar = new Phar('myphar.phar');
 $pgz = $phar->convertToExecutable(Phar::TAR, Phar::GZ); // myphar.phar.tar.gz を作成します
 ?>

http://www.phppro.jp/phpmanual/php/intro.phar.html

2014/08/27 16:06:37
id:wsapp

ありがとうございます。
そんな手があるんですね。
試してみます。

2014/08/28 10:40:36
  • id:tobeoscontinue
    guzzleのversion(ClientInterface.php)はいくつでしょう。

    Goutte depends on PHP 5.4+ and Guzzle 4+.
    とあります。
  • id:wsapp
    コメントありがとうございます。
    ところで、ClientInterface.phpとは何でしょうか?
    ご教授いただけないでしょうか?

    それと、PHP5.4.26も試しましたが、PHP5.5.10と同じエラーでした・・・。
    というのは関係ありませんか?
    チンプンカンプンでスミマセンm(_ _)m
  • id:tobeoscontinue
    //home/hoge/xxx.net/public_html/goutte.phar/vendor/guzzlehttp/guzzle/src/ClientInterface.php
    にあると思います。

    https://github.com/guzzle/guzzle/blob/master/src/ClientInterface.php
    現在は4.2.1のようです。
    const VERSIONが4未満ならguzzleを入れ直す必要があると思いますが
  • id:wsapp
    やっと言葉の意味を理解しました・・・と思います。
    GoutteはGuzzleに依存しているということですね。
    日本語のGoutteを紹介しているサイトはgoutte.pharをインクルードすれば・・・みたいなことを書いてあるサイトばかりでしたので、本家サイトのGuzzleの文字は全く目に入っていませんでした
    m(_ _)m
    GoutteとGuzzleを合わせ検索かけてみます。

    ところで私が参照したサイトで、Goutteが動いている方はGuzzleはインストール済みだということですかね???
    それとも、違う前バージョンはGoutte単体で動いていたのか???
    これも併せて調べてみます。
    ありがとうございました。
  • id:wsapp
    はっ!それともgoutte.pharの最新をダウンロードすれば、Guzzleが勝手に入っているということでしょうか?
    *.pharなんてファイル初めて見たので、まったく解釈できずにいます・・・。
    スミマセン(´・ω・`)
  • id:tobeoscontinue
    http://d.hatena.ne.jp/hnw/20140824
    でguzzlehttpで始まればguzzle4とのことですのでPHP5.5.10ではokと思いますorz。

    https://www.xserver.ne.jp/manual/man_server_log.php
    エックスサーバーのエラーログの方にもう少し詳しいエラーログは出ていないでしょうか。

    CURLOPTの値はcurlのバージョンによってあったり無かったりするようでその辺が関係しているかもしれません。
    phpinfo()でcurlのバージョンを調べることが出来ます。
  • id:tobeoscontinue
    サイト構成がよくわかっていないのですがパスから見るとsymfonyが入っていて、symfonyがguzzleを使っているのでは無いでしょうか。
  • id:tobeoscontinue
    Pharを理解していませんでしたorz。
    おっしゃる通りgoutte.pharの最新をダウンロードすれば、Guzzleが勝手に入ります。(4.1.0でした)
    というかその時だけ。
    必要なものがまとめられ、圧縮されているようなもので実行時に展開されて必要なものが使われるようです。
    結局、的外れでしたorz。
  • id:tobeoscontinue
    http://d.hatena.ne.jp/hnw/20120115
    の下の方にデンジャラスさんが書いていました。
    はてなのタグ名? キーワード? が変更されているからのようです。
    変更して実行してみて下さい。

    >紺野あさ美さんはまだ作成されていないとなるので上手くいかないかもしれません。
  • id:wsapp
    こんばんは。
    何度もありがとうございます。

    デンジャラスさんのコードで行っても
    Warning: curl_setopt_array(): Array keys must be CURLOPT constants or equivalent integer values in phar:///home/seadwell/gate-x.net/public_html/goutte.phar/vendor/guzzlehttp/guzzle/src/Adapter/Curl/CurlFactory.php on line 48
    はとれずにいますorz
    このメッセージは $client->request の行で出ているので、何だかこちらではどうしようもない気がしてきました。


    ところで、教えていただいた
    http://d.hatena.ne.jp/hnw/20140824
    に記載されているGuzzleに興味がわいてきました。
    いま、挙動をいろいろ確認している最中です。

    これで上手く行かないようならphp関数のfile_get_contentsを使いコツコツ作ります。
    ありがとうございました。
  • id:tobeoscontinue
    Warning: curl_setopt_array():
    ワーニングなので実行されていると思ったのですが。
    $crawlerをvar_dump()してみてはどうでしょう。

    <?php
    error_reporting(E_ALL);
    require __DIR__.'/goutte.phar';
    use Goutte\Client;
    $client = new Client();
    $crawler = $client->request('GET', 'http://d.hatena.ne.jp/keyword/%BA%B0%CC%EE%A4%A2%A4%B5%C8%FE');
    var_dump($crawler);
    list(list($title, $url)) = $crawler->filter('section.keyword-container a.title')->extract(array('_text', 'href'));
    $furigana = $crawler->filter('section.keyword-container rt.ruby')->text();

    var_dump($title, $url, $furigana);

    気持ち悪いですがワーニング表示を止めるなら
    http://php.net/manual/ja/function.error-reporting.php
    というテもあります。

    更に
    http://php.net/manual/ja/language.operators.errorcontrol.php
    では通常止まるようなエラーでも実行を続けたと思います。

    PHP 5.4.4, curl 7.26.0ではワーニングは出なかったんですが
    エックスサーバーの環境依存なのか謎です。
  • id:wsapp
    あっ!スミマセン。
    書き方が悪かったですね。
    実行されて値も取れています。
    Warning が気持ち悪くそればかり伝えようとしていましたm(_ _)m

    いろいろアドバイスをいただいて、散々調べていますがいまだWarningは取れないでいます。
    もうムキになっています。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません