2013-08-12 13 views
12

Sto cercando di ottenere il testo da div dove classe = 'review-text', utilizzando l'elemento DOM di PHP con il seguente HTML (stessa struttura) e codice seguenteUtilizzo del documento DOM PHP, per selezionare l'elemento HTML in base alla classe e ottenere il testo

Tuttavia questo non sembra funzionare

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

La sintassi XPATH per selezionare elemento per Classe è fornita in questo Blog

Ho provato molti esempi da StackOverflow, tutorial online, ma nessuno sembra funzionare. Mi sto perdendo qualcosa ?

+1

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

risposta

24

La seguente query XPath fa quello che vuoi. Basta sostituire l'argomento fornito a $ xpath-> query con il seguente:

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

Edit: Per facilitare lo sviluppo, è possibile verificare on-line la propria query XPath a http://www.xpathtester.com/test.

Edit2: Testato questo codice; ha funzionato perfettamente.

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

Ho provato la tua query XPath, che non sembra funzionare neanche. Il problema si trova con la sintassi del codice prima di interrogare l'XPath. –

+0

PHP ti dà qualche errore? –

4

Ampliando Frak Houweling risposta, è anche possibile utilizzare DomXpath per la ricerca all'interno di una specifica DomNode. Questo può essere acheived passando il contextNode come secondo argomento al DomXpath->query metodo:

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

Si noti che durante la ricerca i nodi all'interno è necessario utilizzare percorsi relativi con l'aggiunta di un punto . all'inizio dell'espressione:

"//div[@class='review-text']" // absolute path, search starts from the root element 
".//div[@class='review-text']" // relative path, search starts from the provided contextNode 
Problemi correlati