Используя документ PHP DOM, выберите элемент HTML по его классу и получите его текст.

Я пытаюсь получить текст из div, где class = 'review-text' , используя элемент DOM PHP со следующим HTML (такая же структура) и следующий код.

Однако, похоже, это не работает

  1. 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> '; 
  2. 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, онлайн-уроков, но никто не работает. Я что-то упускаю ?

Solutions Collecting From Web of "Используя документ PHP DOM, выберите элемент HTML по его классу и получите его текст."

Следующий запрос 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