2013-04-11 20 views
6

Sto usando simpile_html_dom per ottenere elementi di pagine html. Ho alcuni elementi div come questo. Tutto quello che voglio è ottenere una frase "Bene, grazie" in ogni div (che non è all'interno di alcun elemento secondario). Come posso farlo?ottenere contenuto elemento con simpe-html-dom

<div class="right"> 
<h2> 
<a href="">Hello</a> 
</h2> 
<br/> 
<span>How Are You?</span> 
<span>How Are You?</span> 
<span>How Are You?</span> 
Fine Thanks 
</div> 
+0

hai provato alcun codice? –

+0

che vuoi ottenere o vuoi inserire in div? – liyakat

+0

Puoi pubblicare altri 2 elementi div? o se ciò si ripete come l'elemento div postato? –

risposta

1

Non v'è alcun costruito nel metodo per leggere la proprietà testo in simple_html_dom.php
Ma questo dovrebbe funzionare;

include 'parser.php'; 

$html = str_get_html('<div class="right"> 
<h2> 
<a href="">Hello</a> 
</h2> 
<br/> 
<span>How Are You?</span> 
<span>How Are You?</span> 
<span>How Are You?</span> 
Fine Thanks 
</div>'); 

function readTextNode($element){ 
    $local = $element; 
    $childs = count($element->childNodes()); 
    for($i = 0; $i < $childs; $i++) 
     $local->childNodes($i)->outertext = ''; 
    return $local->innertext; 
} 

echo readTextNode($html->find('div.right',0)); 
+0

Questo è semplicemente orribile, senza offesa; modificare l'albero solo per estrarre qualcosa è indietro e non dovrebbe essere necessario in una libreria appropriata. Sospiro. –

0
public function removeNode($selector) 
{ 
    foreach ($html->find($selector) as $node) 
    { 
    $node->outertext = ''; 
    } 

$this->load($this->save());   
} 

uso questa funzione per rimuovere l'elemento h2 e la durata della div. Quindi ottieni i dati dell'elemento div.

URL di riferimento: Simple HTML Dom: How to remove elements?

2

E dovrebbe essere semplicemente$html->find('div.right > text'), ma che non funziona perché semplice HTML DOM Parser non sembra supportare le query discendente diretto.

Quindi dovresti trovare prima tutti gli elementi <div> e cercare i nodi figlio per un nodo di testo. Sfortunatamente, il metodo ->childNodes() è mappato su ->children() e quindi restituisce solo gli elementi.

Una soluzione operativa è chiamare ->find('text') su ciascun elemento <div>, dopo il quale si filtrano i risultati in base al nodo genitore.

foreach ($doc->find('div.right') as $parent) { 
    foreach ($parent->find('text') as $node) { 
     if ($node->parent() === $parent && strlen($t = trim($node->plaintext))) { 
      echo $t, PHP_EOL; 
     } 
    } 
} 

Utilizzando DOMDocument, questa espressione XPath farà lo stesso lavoro senza il dolore:

$doc = new DOMDocument; 
$doc->loadHTML($content); 
$xp = new DOMXPath($doc); 

foreach ($xp->query('//div/text()') as $node) { 
    if (strlen($t = trim($node->textContent))) { 
     echo $t, PHP_EOL; 
    } 
} 
+0

Probabilmente ma l'OP dice che ha bisogno di usare 'simpile_html_dom'. Ovviamente XPath ha una soluzione migliore di quella fornita da tutti. –

+1

@silentboy Bene, ecco perché la mia risposta ha entrambi; Dovrei iniziare una campagna anti-simple_html_dom :) –

+0

Non dare la colpa semplice, non c'è davvero modo di ottenere quel nodo di testo (e probabilmente non dovrebbe esserlo) in css. – pguardiario

1

vorrei passare a phpquery per questo. Hai ancora bisogno di usare DOM, ma non troppo doloroso:

require('phpQuery.php'); 

$html =<<<EOF 
<div class="right"> 
<h2> 
<a href="">Hello</a> 
</h2> 
<br/> 
<span>How Are You?</span> 
<span>How Are You?</span> 
<span>How Are You?</span> 
Fine Thanks 
</div> 
EOF; 

$dom = phpQuery::newDocumentHTML($html); 

foreach($dom->find("div.right > *:last") as $last_element){ 
    echo $last_element->nextSibling->nodeValue; 
} 

Aggiornamento In questi giorni sto raccomandando this simple replacement che non consentono di evitare la bruttezza dom:

$doc = str_get_html($html); 
foreach($doc->find('div.right > text:last') as $el){ 
    echo $el->text; 
} 
Problemi correlati