24

DomCrawler コンポーネントを使用しています: http://symfony.com/doc/current/components/dom_crawler.html

CSS のような構文を使用して、特定の属性値を持つ要素を取得したいと思います。

私が使用しているコードは次のとおりです。

$link = $crawler->filter('#product a[data-type="bla"]');

以下は1を返すので、これはうまくいくようです:

echo count($link);

ただし、これ以上フィルタリングすることはできません。できない:

$link->filter('img')->attr('src'); 

これにより、次のエラー メッセージが表示されます。

The current node list is empty.

しかし、そうではないことは確かです。

他の要素で構文を試しましたが、常に同じです。私は何か間違ったことをしていますか、これは不可能ですか (xpath ではなく css のような構文を使用)

4

1 に答える 1

38

私はあなたの問題を追うことができません。2 つのソフトウェア ライブラリdom-crawlercss-selectorの現在の開発バージョン (および 2.1.0 と 2.2.0 バージョン) を使用すると、提供されたサンプル コードは、次の HTML の例を考慮すると問題なく動作します。

<?php
use Symfony\Component\DomCrawler\Crawler;

// require dependencies here    

$html = <<<'HTML'
<!DOCTYPE html>
<html>
    <body>
        <p class="message">Hello World!</p>
        <p>Hello Crawler!</p>
        <div id="product">
            <a data-type="bla">
                <img src="OK">
            </a>
        </div>
    </body>
</html>
HTML;

$crawler = new Crawler($html);

$link = $crawler->filter('#product a[data-type="bla"]');

echo var_dump(count($link));

var_dump($link->filter('img')->attr('src'));

ご覧のとおり、これはまさにあなたのコードです (少しだけ違いますが、本質的には違います)。これにより、次の出力が逐語的に得られます。

int(1)
string(2) "OK"

最初の出力行はcount()で、2 番目は src 属性値です。

composer update を実行しましたか? 入力を再確認しましたか?

于 2013-04-30T13:35:38.853 に答える