Я пытаюсь получить текст из div, где class = 'review-text' , используя элемент DOM PHP со следующим HTML (такая же структура) и следующий код.
Однако, похоже, это не работает
HTML
$html = ' <div class="page-wrapper"> <section class="page single-review" itemtype="http://schema.org/Review" itemscope="" itemprop="review"> <article class="review clearfix"> <div class="review-content"> <div class="review-text" itemprop="reviewBody"> Outstanding ... </div> </div> </article> </section> </div> ';
PHP-код
$classname = 'review-text'; $dom = new DOMDocument; $dom->loadHTML($html); $xpath = new DOMXPath($dom); $results = $xpath->query("//*[@class and contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]"); if ($results->length > 0) { echo $review = $results->item(0)->nodeValue; }
Синтаксис XPATH для выбора элемента по классу предоставляется в этом блоге
Я пробовал много примеров из StackOverflow, онлайн-уроков, но никто не работает. Я что-то упускаю ?
Следующий запрос XPath делает то, что вы хотите. Просто замените аргумент, предоставленный запросу $ xpath->, следующим:
//div[@class="review-text"]
Изменить: для удобства разработки вы можете протестировать свой собственный запрос XPath в Интернете по адресу http://www.xpathtester.com/test .
Edit2: протестирован этот код; он работал отлично.
<?php $html = ' <div class="page-wrapper"> <section class="page single-review" itemtype="http://schema.org/Review" itemscope="" itemprop="review"> <article class="review clearfix"> <div class="review-content"> <div class="review-text" itemprop="reviewBody"> Outstanding ... </div> </div> </article> </section> </div> '; $classname = 'review-text'; $dom = new DOMDocument; $dom->loadHTML($html); $xpath = new DOMXPath($dom); $results = $xpath->query("//*[@class='" . $classname . "']"); if ($results->length > 0) { echo $review = $results->item(0)->nodeValue; } ?>
Расширяясь в ответ Frak Houweling, также можно использовать DomXpath для поиска в пределах определенного DomNode . Это может быть достигнуто путем передачи contextNode
в качестве второго аргумента DomXpath->query
:
$dom = new DOMDocument; $dom->loadHTML ($html); $xpath = new DOMXPath ($dom); foreach ($xpath->query ("//section[@class='page single-review']") as $section) { // search for sub nodes inside each element foreach ($xpath->query (".//div[@class='review-text']", $section) as $review) { echo $review->nodeValue; } }
Обратите внимание, что при поиске внутри узлов вам необходимо использовать относительные пути, добавив точку .
в начале выражения:
"//div[@class='review-text']" // absolute path, search starts from the root element ".//div[@class='review-text']" // relative path, search starts from the provided contextNode