Node.js puppeteer-如何仅从表中获取某些记录(过滤器)

时间:2018-08-31 16:57:47

标签: javascript node.js puppeteer

我正在使用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

2 个答案:

答案 0 :(得分:1)

在选择行之前,可以使用page.$x()来通过XPath表达式检查set link属性的值:

f(x)

结果:

set link

答案 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 ) );
} );