作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 puppeteer 从站点获取一些数据。我需要返回从站点获得的多个值,但由于某种原因我一次只能返回一个值,每当我尝试返回多个值(如下面代码中的值)时,我都会收到以下错误:错误:评估失败:TypeError:返回多个值时无法读取 null 的属性(读取“innerText”)
,我找不到原因。
代码
(async () => {
try {
const chromeBrowser = await puppeterr.launch({ headless: true });
const page = await chromeBrowser.newPage();
await page.goto("https://www.sec.gov/edgar/search/#/category=form-cat2", {timeout: 0});
const getInfo = await page.evaluate(() => {
const secTableEN = document.querySelector(".table td.entity-name");
const secTableFiled = document.querySelector(".table td.entity-filed");
const secTableLink = document.querySelector(".table td.filetype");
return {
secTableEN: secTableEN.innerText,
secTableFiled: secTableFiled.innerText,
};
})
console.log(getInfo);
await page.close();
await chromeBrowser.close();
} catch (e) {
console.error(e)
}
})();
最佳答案
两个问题:
waitForSelector
。.entity-filed
应该是 .filed
。const puppeteer = require("puppeteer"); // ^19.0.0
const url = "<your URL>";
let browser;
(async () => {
browser = await puppeteer.launch();
const [page] = await browser.pages();
const $ = (...args) => page.waitForSelector(...args);
const text = async (...args) =>
(await $(...args)).evaluate(el => el.textContent.trim());
await page.goto(url, {waitUntil: "domcontentloaded"});
const info = {
secTableEN: await text(".table td.entity-name"),
secTableFiled: await text(".table td.filed"),
secTableLink: await text(".table td.filetype"),
};
console.log(info);
})()
.catch(err => console.error(err))
.finally(() => browser?.close());
顺便说一句,我不会使用{timeout: 0}
。如果页面在一分钟左右后仍未加载,则说明出了点问题,您应该报告错误,而不是永远挂起脚本。
另一种方法是避开 DOM 并使用您感兴趣的有效负载简单地拦截 API 响应:
// ... same boilerplate as above ...
browser = await puppeteer.launch();
const [page] = await browser.pages();
const resP = page.waitForResponse(res =>
res.url() === "https://efts.sec.gov/LATEST/search-index"
);
await page.goto(url, {waitUntil: "domcontentloaded"});
const res = await resP;
const data = JSON.parse(await res.text());
const hit = data.hits.hits[0]._source;
const info = {
secTableEN: hit.display_names[0],
secTableFiled: hit.file_date,
secTableLink: hit.file_type // slightly different output than from the DOM
};
console.log(info);
// ...
关于javascript - puppeteer 师得到错误 : Evaluation failed: TypeError: Cannot read properties of null (reading 'innerText' ) when returning multiple values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74311421/
我是一名优秀的程序员,十分优秀!