可以说我有一个像这样的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
- )