使用操纵up将来自2个不同网页的数据收集到数组中以供以后比较。但是,程序不会在继续进行之前等待返回的数组。
async function go(){
try{
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('www.webpage.com');
const tds = await page.$$('td');
const data = [];
for (let i = 0; i < tds.length; i++){
const td = tds[i];
const tdcontent = await page.evaluate(td => td.innerText, td);
if (tdcontent.length > 5) {
data[i] = {"content": tdcontent};
}
}
return data;
} catch (e) {
console.log(e);
}
};
(async function main(){
const returnedData = await go();
console.log(returnedData.length);
})();
返回data.length
为0
。 nodejs的新功能,以及async
编程结构。我认为这是因为在返回.length
之前先记录了data
?
如何以一种可以操作并完成比较的方式返回数据?
在这种情况下,我尝试不使用page.$$
。相反,我使用document.querySelectorAll
并通过元素映射并提取文本。
这里是修改后的代码:
const getTdData = async () => {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("http://example.com");
return page.evaluate(() => {
// get all td elements
const tdList = [...document.querySelectorAll("td")];
return tdList.map(element => ({ content: element.textContent }));
});
} catch (e) {
console.log(e);
}
};
(async function main() {
const returnedData = await getTdData();
console.log(returnedData.length);
})();
首先,您在page.$$()
函数中缺少撇号。您应该将其更改为:
page.$$()
接下来,您正在尝试将不存在的变量传递给const tds = await page.$$('td');
。您可以通过传递page.evaluate()
而不是page.evaluate()
来解决此问题:
tds[i]
您的最终结果应如下所示:
td
[如果您仍然遇到问题,则可能要等到使用const tdcontent = await page.evaluate(td => td.innerText, tds[i]);
完全加载页面,或者等到使用const go = async () => {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('www.webpage.com');
const tds = await page.$$('td');
const data = [];
for (let i = 0; i < tds.length; i++) {
const tdcontent = await page.evaluate(td => td.innerText, tds[i]);
if (tdcontent.length > 5) {
data[i] = {
content: tdcontent,
};
}
}
return data;
} catch (error) {
console.log(error);
}
};
(async function main() {
const returnedData = await go();
console.log(returnedData.length);
})();
将有问题的元素添加到DOM中后,才可以使用:
page.goto( ... , { waitUntil: 'networkidle0' })