【发布时间】:2020-08-11 20:15:24
【问题描述】:
我对 javascript 和 Puppeteer 也很陌生。
我正在尝试从论坛内的一系列网页中获取一些 innerHTML。页面的 URL 遵循具有前缀和末尾“/page-N”的模式,N 是页码。
所以我决定使用 for 循环和模板字面量遍历页面,在每个循环中加载一个新的页面 URL,直到达到最终的页面数,包含在变量 C.numberOfPages 中。
问题是:page.evaluate() 函数内的代码不起作用,当我运行我的代码时,我得到 TypeError: Cannot read property of undefined。我已经检查过,问题的根源是 document.getElementById('discussion_subentries') 返回未定义。
我已经测试了 Chrome 开发工具中 page.evaluate() 函数内部的相同代码,它运行良好,返回了我想要的 innerHTML。由于我正在抓取的页面结构,所有这些 .children[] 连接都是必需的,并且它们在浏览器上运行良好,返回正确的值。
那么如何让它在我的 Puppeteer 脚本中工作?
for (let i = 1; i <= C.numberOfPages; i++) {
let URL = `${C.url}page-${i}`;
await page.goto(URL);
await page.waitForSelector('#discussion_subentries');
let pageData = await page.evaluate(() => {
let discussionEntries = document.getElementById('discussion_subentries')
.children[1];
let discussionEntryMessages = [];
for (let j = 0; j < discussionEntries.childElementCount; j++) {
let thisEntryMessage =
discussionEntries.children[j].children[0].children[1].children[1]
.children[1].innerHTML;
discussionEntryMessages.push(thisEntryMessage);
}
return discussionEntryMessages;
});
entryData.discussionEntryMessages.push(pageData);
}
【问题讨论】:
标签: javascript node.js puppeteer