如何正确遍历DomCrawler结果提取.day元素内的表格单元格内容?
解决DOMCrawler遍历.day元素内表格行和单元格的问题
你遇到的问题其实很常见——当你直接foreach遍历$crawler->filter('.day')的结果时,拿到的是原生DOMElement对象,而不是Crawler实例,这些原生对象并没有filter()方法,自然没法继续筛选tr和td。下面给你两种可行的解决方案:
方案1:将原生DOMElement重新包装为Crawler对象
在遍历每个.day元素时,把它重新实例化成Crawler对象,这样就能继续使用Crawler的筛选方法了:
$crawler = new Crawler($html); $days = $crawler->filter('.day'); foreach ($days as $dayDom) { // 把原生DOMElement包装成Crawler $dayCrawler = new Crawler($dayDom); // 筛选当前day下的所有tr $rows = $dayCrawler->filter('tr'); foreach ($rows as $rowDom) { $rowCrawler = new Crawler($rowDom); $cells = $rowCrawler->filter('td'); foreach ($cells as $cellDom) { // 原生DOMElement可以直接获取textContent echo $cellDom->textContent . PHP_EOL; } } }
方案2:使用Crawler的each()方法链式处理
Crawler提供了更优雅的each()方法,适合这种嵌套筛选的场景,全程不用手动处理原生DOM对象:
$crawler = new Crawler($html); $crawler->filter('.day')->each(function (Crawler $dayCrawler) { $dayCrawler->filter('tr')->each(function (Crawler $rowCrawler) { $rowCrawler->filter('td')->each(function (Crawler $cellCrawler) { // 使用Crawler的text()方法获取文本 echo $cellCrawler->text() . PHP_EOL; }); }); });
小提示
- 如果你需要获取单元格的HTML内容而非纯文本,可以用
$cellCrawler->html()或者原生DOMElement的innerHTML属性。 - 注意筛选器的作用域:每个
filter()都是基于当前Crawler对象的上下文,所以不用担心会选中其他.day元素里的内容。
内容的提问来源于stack exchange,提问作者Louis 'LYRO' Dupont
相关产品推荐
相关产品推荐

