Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在包含其他dom元素但不在任何标记中的Div中提取纯文本_Php_Html_Dom_Scrape - Fatal编程技术网

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

Php 在包含其他dom元素但不在任何标记中的Div中提取纯文本,php,html,dom,scrape,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>

我正在尝试使用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元素,这应该会留下文本。但我希望有一种更优雅的方法:)

谢谢


Andy

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

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

总之,你会这样做

$("#mydiv").clone().children().remove().end().text();
在PHP中(使用phpquery),这将是

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

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

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

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

总之,你会这样做

$("#mydiv").clone().children().remove().end().text();
在PHP中(使用phpquery),这将是

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

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

最简单的方法可能是在给定上下文节点的情况下使用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使其更加具体


我在您的示例上测试了上面的代码,它可以工作。

最简单的方法可能是在给定上下文节点的情况下使用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使其更加具体


我在您的示例中测试了上面的代码,它很有效。

这在phpquery中有效(我没有使用javascript)。天知道是怎么回事:D,但确实如此!谢谢,这在phpquery中是有效的(我没有使用javascript)。天知道是怎么回事:D,但确实如此!感谢Sohnee,这种方法也可以工作,但是由于其复杂性n2(循环中的循环),这可能比其他版本慢,您需要回到学校。这是O(logn),在最坏的情况下是O(n)(我不知道DOMDocument的内部工作原理)。两个循环不构成O(n^2)。我也不知道$(),.clone(),.children(),.remove(),.end(),.text()的内部工作机制。。。你怎么知道这些都不是O(n^2)本身呢?事实上,另一个可能更复杂。很抱歉我的计算错误(正在考虑for循环)。请注意,尽管我对您的评论进行了评分:)您可以通过使用
//div/text()
作为xpath表达式来保存内部循环。很好的一个例子Yoshi,xpath是一门黑暗的艺术,我相信此方法也可以工作,但是由于其复杂性n2(循环中的循环)这可能比你需要回到学校的其他版本要慢。这是O(logn),在最坏的情况下是O(n)(我不知道DOMDocument的内部工作原理)。两个循环不构成O(n^2)。我也不知道$(),.clone(),.children(),.remove(),.end(),.text()的内部工作机制。。。你怎么知道这些都不是O(n^2)本身呢?事实上,另一个可能更复杂。很抱歉我的计算错误(正在考虑for循环)。请注意,尽管我对您的评论进行了评分:)您可以通过使用
//div/text()
作为xpath表达式来保存内部循环