web-dev-qa-db-fra.com

Symfony DomCrawler: Rechercher un élément avec une valeur d'attribut spécifique

J'utilise le composant DomCrawler: http://symfony.com/doc/current/components/dom_crawler.html

J'aimerais, en utilisant la syntaxe CSS, obtenir un élément avec une valeur d'attribut spécifique.

Voici le code que j'utilise:

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

Cela semble fonctionner, car le code suivant renvoie 1:

echo count($link);

Cependant, je ne pourrai jamais filtrer plus loin. Je ne peux pas le faire:

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

Il en résulte le message d'erreur suivant:

The current node list is empty.

Cependant, je sais avec certitude que ce n'est pas le cas.

J'ai essayé la syntaxe sur d'autres éléments et c'est toujours la même chose. Je fais quelque chose de mal ou ce n'est pas possible (avec la syntaxe CSS, pas xpath)

21
Wesley

Je ne peux pas suivre votre problème. Utilisation des versions de développement actuelles (ainsi que des versions 2.1.0 et 2.2.0) des deux bibliothèques logicielles = dom-crawler et css-selector , l'exemple de code que vous avez fourni fonctionne très bien compte tenu de l'exemple HTML suivant:

<?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'));

Comme vous pouvez le voir, c'est exactement votre code (seulement un peu différent mais essentiellement pas), qui donne textuellement la sortie suivante:

int(1)
string(2) "OK"

La première ligne de sortie est la count() et la seconde est la valeur d'attribut src.

Avez-vous exécuté la mise à jour composer? Avez-vous revérifié l'entrée?

33
M8R-1jmw5r