2013-08-12 43 views
12

Tôi cố gắng lấy văn bản từ div trong đó class = 'review-text', bằng cách sử dụng phần tử DOM của PHP với HTML sau (cùng cấu trúc) và mã sau.Sử dụng tài liệu PHP DOM, để chọn phần tử HTML theo lớp của nó và nhận được văn bản

Tuy nhiên điều này dường như không làm việc

  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 Mã

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

Cú pháp XPATH để chọn phần tử theo Class được cung cấp tại đây Blog

Tôi đã thử nhiều ví dụ từ StackOverflow, hướng dẫn trực tuyến, nhưng không có ví dụ nào hoạt động. Tui bỏ lỡ điều gì vậy ?

+1

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

Trả lời

24

Truy vấn XPath sau thực hiện những gì bạn muốn. Chỉ cần thay thế đối số cung cấp cho $ xpath-> truy vấn như sau:

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

Edit: Đối với phát triển dễ dàng, bạn có thể kiểm tra trực tuyến XPath truy vấn của riêng bạn tại http://www.xpathtester.com/test.

Chỉnh sửa2: Đã kiểm tra mã này; nó hoạt động hoàn hảo.

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

Tôi đã thử truy vấn XPath của bạn, điều đó dường như không hoạt động. Vấn đề nằm ở cú pháp mã trước khi truy vấn XPath. –

+0

PHP có cung cấp cho bạn bất kỳ lỗi nào không? –

4

Mở rộng trên Frak Houweling câu trả lời, nó cũng có thể sử dụng DomXpath để tìm kiếm trong một cụ DomNode. Đây có thể đạt được bằng cách truyền contextNode như một cuộc tranh luận thứ hai để DomXpath->query phương pháp:

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

Lưu ý rằng khi tìm kiếm các nút bên bạn cần sử dụng đường dẫn tương đối bằng cách thêm một dấu chấm . vào đầu của biểu thức:

"//div[@class='review-text']" // absolute path, search starts from the root element 
".//div[@class='review-text']" // relative path, search starts from the provided contextNode 
Các vấn đề liên quan