2013-04-11 24 views
6

私はsimpile_html_domを使ってhtml pages要素を取得しています。 私はこのようなdiv要素をいくつか持っています。私が欲しいのは、各部門(それはどんなサブ要素の中にもない)で「良いおかしい」文を得ることだけです。 どうすればいいですか?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

あなたはすべてのコードを試してみましたか? –

+0

divに挿入したいのですか? – liyakat

+0

2つ以上のdiv要素を投稿できますか?またはそれが投稿されたdiv要素のように繰り返されるかどうか? –

答えて

1

simple_html_dom.php
でtextプロパティを読み取るための方法で構築された。しかし、これは動作するはずです何もありません。

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

それはちょっとひどいです。何かを抽出するためだけにツリーを変更することは後方にあり、適切なライブラリでは必要ではありません。一口。 –

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

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

DIVからH2およびスパンの要素を削除するには、この関数を使用します。 div要素のデータを取得します。

参考URL:Simple HTML Dom: How to remove elements?

2

それは単に$html->find('div.right > text')にする必要がありますが、単純なHTML DOMパーサは、直系の子孫クエリをサポートしていないようなので、それは動作しません。

まず、<div>の要素をすべて見つけて、子ノードでテキストノードを検索する必要があります。残念ながら、->childNodes()メソッドは->children()にマップされているため、要素のみが返されます。

解決策は、各<div>要素の->find('text')を呼び出してから、親ノードに基づいて結果をフィルタリングすることです。

DOMDocumentを使用して
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; 
     } 
    } 
} 

、このXPath式は、痛みなしで同じ作業を行います。

$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

おそらくOPは彼に 'simpile_html_dom'を使う必要があると伝えます。もちろん、XPathは我々が提供しているよりも優れたソリューションを持っています。 –

+1

@silentboyそれで、私の答えは両方の理由があります。私はanti-simple_html_domキャンペーンを開始する必要があります:) –

+0

シンプルなことを非難しないでください、実際には、そのテキストノードを取得する方法はありません。 – pguardiario

1

私はこの1つのためにphpqueryに切り替わります。あなたはまだあまりにも痛くないDOMを使用する必要がありますが:

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

更新 あなたは、DOMの醜さを避けるせず、私はthis simple replacementを推奨していますこれらの日:

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