2013-08-12 74 views
12

我試圖從div中獲取文本,其中class = 'review-text',通過使用具有以下HTML(相同結構)的PHP DOM元素和以下代碼。使用PHP DOM文檔,按類選擇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語法來選擇元素Blog

我已經嘗試了很多來自StackOverflow,在線教程的示例,但似乎都沒有工作。我錯過了什麼嗎?

+1

''// div [contains(@class,'review-text')]' –

回答

24

以下XPath查詢可以做到你想要的。剛剛替換爲以下內容提供給$ xpath-參數>查詢:

//div[@class="review-text"] 

編輯: 爲了便於開發,您可以在http://www.xpathtester.com/test測試自己的XPath查詢網上。

編輯2: 測試此代碼;它工作完美。

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

?> 
+0

我試過了你的XPath查詢,這似乎也不起作用。查詢XPath之前,問題是否存在於代碼語法中? –

+0

PHP會給你什麼錯誤嗎? –

4

擴展在Frak Houweling答案,還可以使用DomXpath到特定DomNode內進行搜索。

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

注意,搜索內部節點時,你需要在表達式的開頭添加一個點.使用相對路徑:

這可以通過將 contextNode作爲第二個參數 DomXpath->query方法來達到的
"//div[@class='review-text']" // absolute path, search starts from the root element 
".//div[@class='review-text']" // relative path, search starts from the provided contextNode