在Div中提取包含其他dom元素但不在任何标记内的明文

时间:2011-05-19 12:14:11

标签: php html dom scrape

我正在尝试使用PHP提取一些未包含在任何标签中的纯文本。解释的最佳方式是展示;

<div>
    <span>Hello</span>
        THIS IS THE TEXT I WANT TO EXTRACT
    <span>this is some other text</span>
    <div><span>pow</span></div>
</div>

我正要尝试的是循环并删除div中的所有dom元素,这应该留下文本。但我希望有更优雅的方法:)

由于

安迪

2 个答案:

答案 0 :(得分:3)

如果我正确地阅读了您的问题,您希望获取该元素的文本,但不包括子元素的文本。

使用JavaScript,这里有一个解决方案:

http://www.stevefenton.co.uk/Content/Blog/Date/201007/Blog/Jquery-Get-Text-While-Excluding-Children/

总而言之,你会这样做......

$("#mydiv").clone().children().remove().end().text();

在PHP中(使用phpquery),这将是......

$phpqueryObj = phpQuery::newDocument(DOMinnerHTML($INNERHTMLOFYOURDOMELEMENT));
$text = $phpqueryObj->clone()->children()->remove()->end()->text();

如果没有jQuery / JavaScript,您必须手动执行类似的过程,即从元素的克隆版本中删除子元素,然后获取内部文本。

答案 1 :(得分:1)

最简单的方法可能是在给定上下文节点的情况下使用XPath。

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
//find all div nodes
foreach ($xpath->query('//div') as $div) {
   //get any immediate child text nodes
   foreach ($xpath->query('text()', $div) as $text) {
      echo "$text->nodeValue\n";
   }
}

请注意,第一个查询将返回所有 div,因此您必须使其更适合您想要的div。

我在您的示例中测试了上面的代码并且它可以正常工作。