2013-04-30 6 views
13

Ich verwende die DomCrawler Komponente: http://symfony.com/doc/current/components/dom_crawler.htmlSymfony DomCrawler: Finden Element mit bestimmtem Attributwert

Ich mag, mit der CSS-ähnlichen Syntax, ein Element mit einem bestimmten Attributwert erhalten.

Hier ist der Code, den ich mit:

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

Dies scheint zu funktionieren, wie die folgende Rückkehr 1:

echo count($link); 

Ich kann aber nie weiter nicht filtern als diese. Ich kann es nicht tun:

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

Daraus ergibt sich die folgende Fehlermeldung:

The current node list is empty. 

aber ich weiß sicher, dass es nicht ist.

Ich habe die Syntax auf andere Elemente ausprobiert und es ist immer das gleiche. Ich tue etwas falsch oder ist dies nicht möglich (mit CSS wie Syntax, nicht XPath)

+2

Was ist der Ausgang für 'echo count ($ Link-> Filter ('img'));'? Wenn Sie 0 haben, haben Sie vermutlich kein IMG-Element als Kind Ihrer a. Das ist der Grund von 'Die aktuelle Knotenliste ist leer. ' –

Antwort

22

ich Ihr Problem nicht folgen kann. Mit den aktuellen Entwicklungsversionen (und auch 2.1.0 und 2.2.0-Versionen) der zwei Softwarebibliotheken dom-Crawler und css-selector, der Beispielcode Sie Werke zur Verfügung gestellt ganz gut das folgende Beispiel HTML Berücksichtigung

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

Wie Sie sehen, das ist genau das Code (nur ein wenig anders, aber im wesentlichen nicht), die wörtlich folgende Ausgabe gibt:

int(1) 
string(2) "OK" 

die erste Ausgangsleitung ist der count() und der zweite ist der src Attributwert.

Haben Sie Komponist Update ausführen? Haben Sie die Eingabe noch einmal überprüft?

+0

Vielen Dank für Ihre Antwort. Ich muss mich entschuldigen. Die Eingabe war in der Tat falsch. Es wurde über Javascript transformiert und ich überprüfte über Safari, das keine einfache View-Source-Methode mehr hat, was zu falschen Annahmen der Daten führt. – Wesley

+1

@Wesley: https://discussions.apple.com/thread/4325736?start=0&tstart=0 <- Sie haben das Entwicklermenü aktiviert? –