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

前端之家收集整理的这篇文章主要介绍了DomCrawler Symfony:如何从不包括孩子的节点获取内容?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
可以说我有一个像这样的html页面
  1. <html>
  2. <head></head>
  3. <body>
  4. Hello World!
  5. <div> my other content </div>
  6. </body>
  7. </html>

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

我认为这会奏效:

  1. $crawler = $crawler
  2. ->filter('body > div');
  3. ->reduce(function (Crawler $node,$i) {
  4. return false;
  5. });

但这显然会出错:

  1. InvalidArgumentException: "The current node list is empty"

解决方法

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

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

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

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

  1. <html>
  2. <head></head>
  3. <body>
  4. Hello World!
  5. <div> my other content </div>
  6. Some other text
  7. </body>
  8. </html>

你可能会这样做:

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

这将返回一个数组:

  1. Array
  2. (
  3. [0] =>
  4. Hello World!
  5.  
  6. [1] =>
  7. Some other text
  8.  
  9. )

猜你在找的HTML相关文章