php xpath: запрос в результате запроса

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

Идея состоит в том, чтобы получить классы span с 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 

Solutions Collecting From Web of "php xpath: запрос в результате запроса"

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

 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; } } 

Вместо выполнения второго запроса попробуйте 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; } 

Это позволит получить дочерние элементы span div с классом thebest, имеющим класс заголовка или desc.