2010-08-23 75 views
0

我试图从页面中提取所有相关的URL和图像,并将它们放入一个数组中,下面的代码工作正常,除了它输出第一对数字的正确数字倍。我想也许我在指定XPATH时犯了错误,但我已经在3个不同的站点上测试过,每次都有相同的结果。PHP DOMXPATH&Array

$dom = new DOMDocument(); 
$dom->loadHtml($html); 
$xpath = new DOMXPath($dom); 

$items = $xpath->query("//div[@class=\"row\"]"); 

foreach ($items as $item) { 

$value['url'] = $xpath->query("//div[@class=\"productImg\"]/a/@href",$item)->item(0)->nodeValue; 

$value['img'] = $xpath->query("//div[@class=\"productImg\"]/a/img/@src",$item)->item(0)->nodeValue; 

$result[] = $value; 


} 

print_r($result); 

很明显,代码是不正确的,但我还没有能够缩小到违规部分。在有人建议使用正则表达式之前,我通常会这样做,但如果可能的话,我宁愿使用XPATH。

回答

1

鉴于query("//div[@class=\"productImg\"]/a/img/@src",$item)它看起来像你想执行相对$item查询。你几乎没有,只是不完全。

您的查询与//div开始,这意味着,以寻找任何<div>节点它们是文档根的后代和满足所述查询的所述剩余部分。您堕落的关键在于,如文中所述,该表达式来自文档根目录。

为了选择上下文节点,你应该.这样.//div将匹配任何<div>节点它们是从上下文节点后代开始表达(即你的$item)。

+0

你是对的,谢谢! – 2010-08-24 19:14:25

0

对于HTML的外观有太多的假设,但是我可以发现的一个问题是 - > item(0)部分。这需要反映所讨论的迭代。

假设$项目总会有数字键:

foreach($items as $key => $item) { 
..... item)->item($key)->nodeValue; 
}