DomCrawler Symfony:如何从不包括孩子的节点获取内容?

可以说我有一个像这样的html页面
<html>
<head></head>
<body>
    Hello World!
    <div> my other content </div>
</body>
</html>

我如何从DOM Crawler获得“Hello World”?

我认为这会奏效:

$crawler = $crawler
    ->filter('body > div');
    ->reduce(function (Crawler $node,$i) {
        return false;
    });

但这显然会出错:

invalidargumentexception: "The current node list is empty"

解决方法

不知道这是否可以更容易,但您可以使用XPath提取文本节点内容
$crawler->filterXPath('//body/text()')->text();

结果将是一个包含Hello World的字符串,文本前后的空格直到第一个标记.因此,如果您只需要文本本身,则可以修剪该值:

$helloWorld = trim($crawler->filterXPath('//body/text()')->text());

但是,如果您在正文中有多个文本节点,这将适用于您的情况,例如:

<html>
<head></head>
<body>
    Hello World!
    <div> my other content </div>
    Some other text
</body>
</html>

你可能会这样做:

$crawler->filterXPath('//body/text()')->extract(['_text']));

这将返回一个数组:

Array
(
    [0] =>
        Hello World!

    [1] =>
        Some other text

)

相关文章

vue阻止冒泡事件 阻止点击事件的执行 &lt;div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些