Php 使用simpe html dom获取元素内容
我使用simpile\u html\u dom获取html页面元素。 我有一些像这样的div元素。我只想在每个div中得到“finedthanking”语句(不在任何子元素中)。 我怎么做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
<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;
}