Php 使用simpe html dom获取元素内容

Php 使用simpe html dom获取元素内容,php,html,simple-html-dom,Php,Html,Simple Html Dom,我使用simpile\u html\u dom获取html页面元素。 我有一些像这样的div元素。我只想在每个div中得到“finedthanking”语句(不在任何子元素中)。 我怎么做 <div class="right"> <h2> <a href="">Hello</a> </h2> <br/> <span>How Are You?</span> <span>How Are You

我使用simpile\u html\u dom获取html页面元素。 我有一些像这样的div元素。我只想在每个div中得到“finedthanking”语句(不在任何子元素中)。 我怎么做

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


你好吗? 你好吗? 你好吗? 很好,谢谢
使用此函数从div中删除h2和span元素。然后获取div元素数据


参考URL:

在simple\u html\u 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));
包括“parser.php”;
$html=str\u get\u html('

你好吗? 你好吗? 你好吗? 很好,谢谢 '); 函数readTextNode($element){ $local=$element; $childs=count($element->childNodes()); 对于($i=0;$i<$childs;$i++) $local->childNodes($i)->outertext=''; 返回$local->innertext; } echo readTextNode($html->find('div.right',0));
它应该是简单的
$html->find('div.right>text')
,但这不起作用,因为简单的html DOM解析器似乎不支持直接后代查询

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

一个有效的解决方案是在每个
元素上调用
->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;
        }
    }
}
使用,此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;
    }
}

我会切换到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;
}

你试过任何代码吗?你想得到或想插入到div中吗?你能再发布2个div元素吗?或者这句话是否会像张贴的div元素一样重复?@Jenson M Jhon:它们的结构相同,但内容不同@liyakat:我想读一读“很好,谢谢”这句话,太糟糕了,没有冒犯的意思;仅仅为了提取某些内容而修改树是向后的,在适当的库中不需要这样做。叹气。也许吧,但OP告诉他需要使用
simpile\u html\u dom
。当然,XPath有一个比我们都提供的更好的解决方案。@silentboy好吧,这就是为什么我的答案两者都有;我应该发起一场反简单的html dom活动:)不要责怪简单,在css中真的没有办法找到那个文本节点(可能不应该)。@pguard你看到我使用的xpath表达式了吗?那只很好用。
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;
}
$doc = str_get_html($html);
foreach($doc->find('div.right > text:last') as $el){
  echo $el->text;
}