2013-04-11 3 views
6

Ich benutze simpile_html_dom zum Erhalten von HTML-Seitenelementen. Ich habe einige div-Elemente wie folgt. Alles, was ich will, ist "Fine Thanks" -Satz in jedem div (das ist nicht in einem Unterelement). Wie kann ich es tun?Elementinhalt mit simpe-html-dom erhalten

<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

haben Sie einen Code versucht? –

+0

wollen oder einfügen in div? – liyakat

+0

Können Sie zwei weitere div-Elemente posten? oder ob sich das wie das gepostete div-element wiederholt? –

Antwort

1

Es gibt keine Methode gebaut Eigenschaft text in simple_html_dom.php
Aber das sollte funktionieren zu lesen;

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

Das ist einfach schrecklich, nichts für ungut; Den Baum zu modifizieren, nur um etwas zu extrahieren, ist rückwärts und sollte in einer richtigen Bibliothek nicht notwendig sein. Seufzer. –

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

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

diese Funktion wird das h2 und span-Element aus dem div zu entfernen. Dann hol dir die div Element Daten.

Reference URL: Simple HTML Dom: How to remove elements?

2

Es sollte einfach seine $html->find('div.right > text'), aber das wird da nicht funktioniert Einfache HTML-DOM-Parser direkte Nachkommen Abfragen zu unterstützen scheint nicht.

Sie müssten also zuerst alle <div> Elemente finden und die Kindknoten nach einem Textknoten durchsuchen. Leider ist die ->childNodes()-Methode auf ->children() abgebildet und gibt daher nur Elemente zurück.

Eine funktionierende Lösung ist ->find('text') auf jedem Element <div> aufrufen, nach dem Sie die Ergebnisse basierend auf dem übergeordneten Knoten filtern.

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

Mit DOMDocument dieser XPath-Ausdruck wird ohne den Schmerz, die gleiche Arbeit tun:

$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

Wahrscheinlich, aber das OP sagt, dass er 'simpile_html_dom' benutzen muss. Natürlich hat XPath eine bessere Lösung als wir alle bereitgestellt haben. –

+1

@silentboy Nun, das ist der Grund, warum meine Antwort beides hat; Ich sollte eine Anti-Simple_html_dom Kampagne starten :) –

+0

Tadeln Sie nicht einfach, es gibt wirklich keine Möglichkeit, an diesem Textknoten (und wahrscheinlich sollte nicht sein) in CSS. – pguardiario

1

ich phpquery für diesen einen Schalter würde. Sie müssen noch DOM verwenden, aber nicht zu schmerzhaft:

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

aktualisieren In diesen Tagen ich this simple replacement ich empfehle Ihnen die dom Hässlichkeit nicht lassen vermeiden:

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