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

时间:2014-08-25 11:28:40

标签: symfony web-crawler

假设我有一个这样的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"

1 个答案:

答案 0 :(得分:10)

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

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

结果将是包含string的{​​{1}}以及文字前后的空格,直到第一个标记。因此,如果您只想要文本本身,您可以修改值:

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']));