我正在使用node.js和puppeteer来获取一些数据。从目标表中,我只想获取某些记录。更具体而言,带有innerText:'file的记录。 ........ .idx'。
下面显示了我的查询:
const tableRows = await page.$$('table > tbody tr');
console.log(tableRows.length);
let tableCell01;
let tableCell01Val;
for (let i=1; i < tableRows.length; i++){
tableRow = tableRows[i];
tableCell01 = await tableRow.$('td:nth-child(1) a');
tableCell01Val = await page.evaluate( tableCell01 => tableCell01.href, tableCell01 );
console.log('\n');
console.log(tableCell01Val);
}
这里没有过滤的输出是:
控制台:
6
file.20180702.idx
file.20180703.idx
file.20180705.idx
sitemap.20180702.xml
sitemap.20180703.xml
sitemap.20180705.xml
所以期望的结果应该是:
控制台:
3
file.20180702.idx
file.20180703.idx
file.20180705.idx
执行此操作的最佳方法是什么?最好的办法是在循环之前进行过滤...以获取正确的tableRows.length
答案 0 :(得分:1)
答案 1 :(得分:1)
我将使用page.$$eval
(针对由选择器匹配的元素数组评估一个函数)。只需一次调用浏览器,即可完成所有必需的操作。
伪代码(假设所有第一个孩子td
都有一个a
孩子):
const hrefArray = await page.$$eval( 'table > tbody tr', trs => {
return trs.map( tr => {
return tr.querySelector( 'td:nth-child(1) a' ).href;
} ).filter( href => /^file.*idx$/.test( href ) );
} );