PHP DOMXPATH & Array - PullRequest
       6

PHP DOMXPATH & Array

0 голосов
/ 23 августа 2010

Я пытаюсь извлечь все релевантные URL-адреса и изображения со страницы и поместить их в массив. Приведенный ниже код работает нормально, за исключением того, что он выводит первую пару снова и снова для численно правильного числа раз. Возможно, я ошибался при указании XPATH, но я тестировал его на 3 разных сайтах, каждый раз получая один и тот же результат.

$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 сейчас, если это возможно.

Ответы [ 2 ]

1 голос
/ 23 августа 2010

С учетом query("//div[@class=\"productImg\"]/a/img/@src",$item) похоже, что вы хотите выполнить запрос относительно до $item.Вы очень близки к этому , просто не совсем.

Ваш запрос начинается с //div, что означает поиск любых <div> узлов, являющихся потомками корня документа и удовлетворить оставшуюся часть запроса.Ключевое место, куда вы попадаете, - это, как уже упоминалось, выражение из корня документа.

Чтобы выбрать узел контекста, вы должны начать выражение с ., чтобы .//div будет соответствовать любым <div> узлам, которые являются потомками от узла контекста (т.е. ваш $item).

0 голосов
/ 23 августа 2010

Существует слишком много предположений о том, как выглядит ваш HTML, но одна проблема, которую я сразу заметил, - это часть -> item (0).Это 0 должно отражать рассматриваемую итерацию.

Предполагая, что $ items всегда будет иметь числовые ключи:

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