6

我正在使用 simile_html_dom 获取 html 页面元素。我有一些像这样的 div 元素。我想要的只是在每个 div 中获得“Fine Thanks”句子(不在任何子元素内)。我该怎么做?

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

4 回答 4

2

应该$html->find('div.right > text')simple ,但这不起作用,因为 Simple HTML DOM Parser 似乎不支持直接后代查询。

因此,您必须首先找到所有<div>元素并在子节点中搜索文本节点。不幸的是,该->childNodes()方法被映射到->children(),因此只返回元素。

一个可行的解决方案是调用->find('text')每个<div>元素,然后根据父节点过滤结果。

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;
    }
}
于 2013-04-11T07:34:56.153 回答
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));
于 2013-04-11T07:21:33.713 回答
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 丑陋:

$doc = str_get_html($html);
foreach($doc->find('div.right > text:last') as $el){
  echo $el->text;
}
于 2013-04-11T20:42:57.700 回答
0
public function removeNode($selector)
{
  foreach ($html->find($selector) as $node)
  {
    $node->outertext = '';
  }

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

使用此函数从 div 中删除 h2 和 span 元素。然后获取 div 元素数据。

参考网址:简单的 HTML Dom:如何删除元素?

于 2013-04-11T06:47:25.730 回答