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

Puppeteer爬虫报错TypeError: page.$x is not a function求助

解决Puppeteer中TypeError: page.$x is not a function的问题

核心原因

page.$x()是Puppeteer Page实例的内置方法,报错说明你调用该方法的page变量并非有效的Puppeteer Page实例——可能是变量未正确初始化、被覆盖、或者Page实例已被销毁。

排查与修复步骤

1. 验证tryPathVariationOnPage方法的参数

检查调用tryPathVariationOnPage时传入的page参数是否为合法的Page实例,先做有效性校验:

async function tryPathVariationOnPage(page, variation) {
  // 先验证page实例有效性
  if (!page || typeof page.$x !== 'function') {
    console.error('Invalid Page instance passed to tryPathVariationOnPage');
    return null;
  }
  // 后续原有逻辑
  const elements = await page.$x(variation.xpath);
  // ... 提取标题和URL的逻辑
}

2. 检查Page实例的生命周期

确认调用page.$x()时,Page实例未被关闭或销毁:

  • 避免在page.close()之后执行DOM操作
  • 异步流程中确保page实例始终可用(比如不要在未等待page创建完成的情况下调用方法)

3. 排查变量覆盖问题

检查修改PATH_VARIATIONS时是否意外覆盖了page变量:

  • 比如在循环遍历PATH_VARIATIONS时,使用了同名变量page导致原实例被覆盖
  • 检查代码中是否有let page = ...之类的重新赋值操作

4. 修复职位标题与URL提取逻辑

结合careerjet.dk当前页面结构,重新编写提取逻辑(示例以实际页面元素为准,需自行调整选择器):

async function getPageTitlesAndUrls(page) {
  try {
    // 先验证page有效性
    if (!page || typeof page.$x !== 'function') {
      throw new Error('Invalid Page instance');
    }
    // 替换为当前页面的职位元素XPath
    const jobElements = await page.$x("//div[@class='job']");
    const results = [];
    for (const el of jobElements) {
      const title = await page.evaluate(el => el.querySelector('h3 a').textContent.trim(), el);
      const url = await page.evaluate(el => el.querySelector('h3 a').href, el);
      results.push({ title, url });
    }
    return results;
  } catch (err) {
    console.error(`Error at getPageTitlesAndUrls() → ${err.message}`);
    return [];
  }
}

额外提示

  • 打开目标页面的开发者工具,重新确认职位元素的XPath/CSS选择器,确保PATH_VARIATIONS中的选择器与当前页面结构匹配
  • 运行代码时添加调试日志,打印page变量的类型,确认是否为Puppeteer Page实例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:15:07