You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用fabpot/goutte v4.0爬取图片报Node list is empty错误如何解决

问题原因

  • 选择器规则错误:通过浏览器元素审查工具复制的选择器中包含tbody标签,该标签是浏览器渲染DOM时自动补充的,目标页面原始HTML源码中不存在tbody节点,导致选择器匹配不到对应元素,触发空节点列表报错。
  • 多余的Crawler实例创建:$client->request()执行GET请求后返回的本身就是Symfony Crawler实例,不需要手动提取HTML内容再重新实例化Crawler,重复解析过程可能存在内容偏差。
  • 缺少节点存在性校验:代码未提前判断选择器匹配到的节点是否存在,直接调用each()遍历方法就会触发空节点报错。

解决建议

  • 修正CSS选择器:删除选择器中的tbody标签,也可以根据页面特征简化为更稳定的通用匹配规则,避免依赖层级过深的精准选择器,降低页面结构微调导致的匹配失败概率。
  • 直接复用Goutte返回的Crawler实例,减少多余的解析步骤。
  • 新增节点存在判断逻辑,确认匹配到节点后再执行遍历操作。
  • 若修正后仍然匹配不到节点,可先打印请求返回的HTML源码,确认是否被站点反爬拦截,可主动设置User-Agent头模拟浏览器请求。

修正后参考代码

use Goutte\Client;

// 初始化Goutte客户端
$client = new Client();
// 可选:设置User-Agent模拟浏览器请求,避免被反爬拦截
$client->setHeader('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
// 直接获取请求返回的Crawler实例,无需手动重新创建
$crawler = $client->request('GET', "https://www.laststicker.com/cards/panini_fifa_womens_world_cup_2019/1/");

$imgUrls = [];
// 修正选择器,删除不存在的tbody标签
$imgNodes = $crawler->filter('#content > table > tr > td:nth-child(1) > div:nth-child(1) > img');

// 先判断是否匹配到节点再执行遍历操作
if ($imgNodes->count() > 0) {
    $imgNodes->each(function ($node) use (&$imgUrls) {
        $imgUrls[] = $node->attr('src');
    });
}

内容的提问来源于stack exchange,提问作者Carol.Kar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:09:02