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

