php xpath: запрос в результате запроса - PullRequest
4 голосов
/ 06 июля 2010

Я пытаюсь разобрать html-файл.

Идея состоит в том, чтобы выбрать диапазоны с классами title и desc и получить их информацию в каждом div, который имеет атрибут class = 'thebest '.

вот мой код:

<?php

$example=<<<KFIR
<html>
<head>
<title>test</title>
</head>
<body>
 <div class="a">moshe1
<div class="aa">haim</div>
 </div>
 <div class="a">moshe2</div>
 <div class="b">moshe3</div>

<div class="thebest">
<span class="title">title1</span>
<span class="desc">desc1</span>
</div>
<div class="thebest">
span class="title">title2</span>
<span class="desc">desc2</span>
</div>

</body>
</html>
KFIR;


$doc = new DOMDocument();
@$doc->loadHTML($example);
$xpath = new DOMXPath($doc);
$expression="//div[@class='thebest']";
$arts = $xpath->query($expression);

foreach ($arts as $art) {
    $arts2=$xpath->query("//span[@class='title']",$art);
    echo $arts2->item(0)->nodeValue;
    $arts2=$xpath->query("//span[@class='desc']",$art);
    echo $arts2->item(0)->nodeValue;
}
echo "done";

ожидаемые результаты:

title1desc1title2desc2done 

результаты, которые я получаю:

title1desc1title1desc1done

Ответы [ 2 ]

11 голосов
/ 06 июля 2010

Сделайте запросы относительными ... начните их с точки (например, ".//…").

foreach ($arts as $art) {
    // Note: single slash (direct child)
    $titles = $xpath->query("./span[@class='title']", $art);
    if ($titles->length > 0) {
        $title = $titles->item(0)->nodeValue;
        echo $title;
    }

    $descs = $xpath->query("./span[@class='desc']", $art);
    if ($descs->length > 0) {
        $desc = $descs->item(0)->nodeValue;
        echo $desc;
    }
}
1 голос
/ 06 июля 2010

Вместо выполнения второго запроса попробуйте textContent

foreach ($arts as $art) {
    echo $art->textContent;
}

textContent, чтобы вернуть текстовое содержимое этого узла и его потомков.

В качестве альтернативы измените XPath на

$expression="//div[@class='thebest']/span[@class='title' or @class='desc']";
$arts = $xpath->query($expression);

foreach ($arts as $art) {
    echo $art->nodeValue;
}

Это приведет к тому, что дочерние элементы div'ов получат класс thebest, имеющий класс title или desc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...