Node.js puppeteer - Как извлечь из таблицы только определенные (отфильтрованные) записи - PullRequest
0 голосов
/ 31 августа 2018

Я использую 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 голосов
/ 31 августа 2018

Я бы использовал 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 ) );
} );
0 голосов
/ 31 августа 2018

Вы можете использовать page.$x(), чтобы проверить значение атрибута href с помощью выражения XPath перед выбором строк:

const tableRows = await page.$x( '//table/tbody/tr/td[1]/a[starts-with(@href, "file.")]/../..' );

Результат:

3

file.20180702.idx
file.20180703.idx
file.20180705.idx
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...