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

Puppeteer evaluate报Cannot read properties of null错误如何解决

报错根因

这个错误的核心触发逻辑是:x.querySelector('.s-item__title--tagblock span.POSITIVE')返回了null,直接对null调用textContent属性就会抛出类型错误。具体触发场景有三个:

  1. eBay搜索结果的.s-item列表第一个节点是平台自带的非商品占位项,内部没有你要找的售出日期标签,全量遍历的时候第一个节点就会触发空值错误
  2. 判空逻辑顺序写反,且空值合并运算符写法错误:原代码是先取textContent再做判空,空值逻辑根本来不及执行;另外? ?是非法语法,正确写法是??
  3. 只等待了.s-item外层节点加载,没有等待内部的日期子元素渲染完成,部分节点加载时内部标签还没挂载,也会出现匹配不到的情况
修复方案

按以下步骤调整代码即可:

  • 遍历商品列表时跳过第一个占位节点,eBay该类搜索页第一个.s-item固定为引导/广告占位,不属于真实商品条目
  • 调整判空顺序:先判断选择器匹配到的元素是否存在,再读取textContent属性,同时修正空值运算符的写法
  • 增加子元素等待逻辑,等至少一个日期标签渲染完成后再执行DOM抓取,避免渲染时序问题
  • 补全遗漏的基础逻辑:比如引入puppeteer、执行完抓取后关闭浏览器实例,避免内存泄漏
修正后可运行代码
const puppeteer = require('puppeteer');

async function scrape() {
  const browser = await puppeteer.launch({
    headless: false
  });

  const page = await browser.newPage();
  // 配置常规UA避免被反爬识别
  await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36');
  await page.goto('https://www.ebay.com/sch/i.html?_from=R40&_nkw=Blastoise+%282%2F102%29+%5BCelebrations%3A+Classic+Collection%5D&_sacat=0&Graded=No&_dcat=183454&rt=nc&LH_Sold=1&LH_Complete=1', {
    waitUntil: 'domcontentloaded'
  });

  // 等待外层商品列表和内层日期标签都加载完成
  await page.waitForSelector('.s-item');
  await page.waitForSelector('.s-item__title--tagblock span.POSITIVE', { timeout: 5000 });

  const cards = await page.evaluate(() => {
    const cardElements = document.querySelectorAll('.s-item');
    // 转数组后跳过第一个占位项,遍历真实商品
    return Array.from(cardElements)
      .slice(1)
      .map(item => {
        const dateEl = item.querySelector('.s-item__title--tagblock span.POSITIVE');
        return {
          date: dateEl ? dateEl.textContent.trim() : null
        }
      })
      // 过滤掉没有取到有效日期的条目
      .filter(card => card.date);
  })

  console.log(cards);
  await browser.close();
}

scrape();
额外排查提示
  • 如果后续还是出现匹配不到的情况,可以在evaluate回调里打印对应节点的innerHTML,确认实际渲染的class名,eBay会不定期调整页面节点的class命名
  • 不要用Object.values转换NodeList类型,直接用Array.from兼容性和稳定性更好
  • 如果遇到页面加载超时,可以适当调大waitForSelector的timeout阈值,或者增加waitUntil: 'networkidle2'配置等网络请求空闲后再抓取

内容的提问来源于stack exchange,提问作者Medusa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:51:24