2013-04-11 70 views
6

我正在使用simpile_html_dom獲取html頁面元素。 我有一些像這樣的div元素。我想要的是在每個div中都得到「Fine Thanks」句子(不在任何子元素內)。 我該怎麼做?使用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

確實沒有嘗試過任何的代碼? – 2013-04-11 06:38:26

+0

你想得到或想要在div中插入? – liyakat 2013-04-11 06:40:37

+0

你能發佈2個更多div元素嗎?或者是否重複發佈div元素? – 2013-04-11 06:45:50

回答

1

沒有內置的方法來讀取simple_html_dom.php文本屬性
但這應該工作;

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

這太可怕了,沒有冒犯性;爲了提取某些東西而修改樹是落後的,在適當的庫中不應該是必需的。嘆。 – 2013-04-11 08:33:52

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

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

使用該函數從DIV除去H2和跨度元件。然後獲取div元素數據。

參考網址:Simple HTML Dom: How to remove elements?

2

應該是簡單$html->find('div.right > text'),但不會工作,因爲簡單的HTML DOM解析器似乎並不支持嫡系查詢。

因此,您必須首先找到所有<div>元素並搜索子節點以查找文本節點。不幸的是,->childNodes()方法映射到->children(),因此只返回元素。

一個工作解決方案是在每個<div>元素上調用->find('text'),然後根據父節點過濾結果。

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

使用DOMDocument,這個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有比我們所有提供的更好的解決方案。 – 2013-04-11 08:38:35

+1

@silentboy那麼,這就是爲什麼我的答案都有;我應該開始一個反simple_html_dom活動:) – 2013-04-11 08:40:28

+0

不要責怪簡單,真的沒有辦法得到該文本節點(可能不應該)在CSS中。 – pguardiario 2013-04-11 20:32:18

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

更新 這些天我推薦this simple replacement這也讓你避免了DOM醜陋:

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