使用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
相关产品推荐
相关产品推荐

