Puppeteer =>如何在<tr>标签上循环访问所有<td>

时间:2019-11-03 20:58:31

标签: puppeteer

我需要访问具有特定值的td,但是这样做,我需要另外确定该特定值所在的行号和td号(表随时间变化,我需要通用方法)。我考虑过要在两个循环中对行号和单元格号进行计数,因此一旦找到搜索值,就可以提取其行号和单元格号。问题是,一旦我开始遍历行,如何访问每一行的所有tds?

const rows = await page.$$('.CalendarMonthGrid > :nth-child(1) > div > table > tbody > tr');
for (var i = 0; i < rows.length; i++) {
  // how to iterate over the tds?
}

2 个答案:

答案 0 :(得分:0)

如果您每次都知道表列号完全相同,则可以通过仅选择td来循环它。在一个循环内创建一个循环很难维护,并且基本上比仅一个循环慢。 例如,您的表包含5列。

let this_row, this_col;
let column = 5; // Specify your column number here
const data = await page.$$('.CalendarMonthGrid > :nth-child(1) > div > table > tbody > tr > td');

for (let i = 0; i < data.length; i++) {
    // Here you can find row number for every td by doing this
    this_row = Math.ceil( (i + 1)/column )
    // Here you can find column number by doing this
    this_col = (i + 1) % column
}

如果您的表是动态的,并且具有未知的特定列和行数,那么您的代码将像这样。

let this_row, this_col;
const data = await page.$$('.CalendarMonthGrid > :nth-child(1) > div > table > tbody > tr > td');
const row_num = (await page.$$('.CalendarMonthGrid > :nth-child(1) > div > table > tbody > tr > td:nth-child(1)')).length;
const column = data.length / row_num;

for (let i = 0; i < data.length; i++) {
    // Here you can find row number for every td by doing this
    this_row = Math.ceil( (i + 1)/column )
    // Here you can find column number by doing this
    this_col = (i + 1) % column
}

答案 1 :(得分:0)

取决于您要执行的操作,但这是获取element和Element(在您的情况下为特定td)的索引的方法之一。

const rows = await page.$$('.CalendarMonthGrid > :nth-child(1) > div > table > tbody > tr');
rows.map((trNode, index) => {
   // here you have access to your node + index of it
});