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

apf*_*pfz 6 web-crawler symfony

可以说我有一个像这样的html页面:

<html>
<head></head>
<body>
    Hello World!
    <div> my other content </div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我如何从DOM Crawler获得"Hello World"?

我认为这会奏效:

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

但这显然会出错:

InvalidArgumentException: "The current node list is empty"
Run Code Online (Sandbox Code Playgroud)

Igo*_*vić 10

不知道这是否可以更容易,但您可以使用XPath提取文本节点内容:

$crawler->filterXPath('//body/text()')->text();
Run Code Online (Sandbox Code Playgroud)

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

$helloWorld = trim($crawler->filterXPath('//body/text()')->text());
Run Code Online (Sandbox Code Playgroud)

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

<html>
<head></head>
<body>
    Hello World!
    <div> my other content </div>
    Some other text
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

你可能会这样做:

$crawler->filterXPath('//body/text()')->extract(['_text']));
Run Code Online (Sandbox Code Playgroud)

这将返回一个数组:

Array
(
    [0] =>
        Hello World!

    [1] =>
        Some other text

)
Run Code Online (Sandbox Code Playgroud)