使用Symfony DomCrawler选择文本节点


Select text nodes with Symfony DomCrawler

是否有任何方法可以使用Symfony的DomCrawler来选择父元素的文本节点?

在jQuery中,您可以使用contents()方法并检查nodeType == 3

据我所知,Symfony爬网程序不允许遍历文本节点。对于爬行器的典型用途,深入到文本节点可能并不常见。

然而,爬网程序真正存储文档数据的DOMNode确实允许文本节点遍历。

例如,如果你想在爬网程序的所有节点(包括文本节点)上循环(假设它已经被过滤到一个结果),你可以这样做:

foreach ($crawler->getNode(0)->childNodes as $node) {
    if ($node->nodeName === '#text') {
        // you have a text node
    }
}

需要注意的几点:

  1. getNode()的调用实际上返回了一个DOMNode(IDE中的代码完成告诉我DOMElement,但DOMNode是一个更安全的选择,因为它是基类),所以它将其从Crawler的上下文中提取出来;从这里开始,您需要使用DOMNode属性和方法。

  2. DOMNode的nodeName属性是元素的HTML标记名,但在文本节点的情况下,它似乎设置为#text。或者,您也可以使用$node instanceof DOMText来检测文本节点。

我知道这个问题比较老,但我也有问题,想得到答案,因为它在谷歌上弹出得很高。