Symfony DomCrawler:查找具有特定属性值的元素

25

我正在使用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.

但我可以确定它并不是这样。

我尝试将该语法用于其他元素,结果都一样。我是做错了什么还是这不可能实现(使用类似 CSS 的语法,而非 XPath)?


2
echo count($link->filter('img')); 的输出是什么?如果是0,我猜你的a标签下没有img元素作为子元素。这就是出现 The current node list is empty. 的原因。 - Stefano Sala
1个回答

39

我无法理解你的问题。使用当前版本(以及2.1.0和2.2.0版本)的两个软件库 dom-crawlercss-selector,你提供的示例代码在考虑以下示例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(),第二行是src属性的值。

您是否运行了composer update?您是否仔细检查了输入?


谢谢你的回答。我必须道歉。输入确实不正确。它是通过JavaScript转换的,而我是通过Safari进行检查的,但Safari不再有简单的查看源代码方法,导致对数据做出了错误的假设。 - user429620
1
@Wesley:https://discussions.apple.com/thread/4325736?start=0&tstart=0 <- 你启用了开发者菜单吗? - M8R-1jmw5r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接