想用puppeteer.js刮桌子。如何获取所有行,遍历行,然后为每行获取“td”

时间:2018-03-12 13:54:43

标签: javascript html headless-browser puppeteer

我有puppeteer js设置,并且能够使用

获取所有行
let rows = await page.$$eval('#myTable tr', row => row);

现在我想让每一行获得“td”,然后从那些行获取内部文本。

基本上我想这样做:

var tds = myRow.querySelectorAll("td");

其中myRow是一个表行,带有puppeteer.js

2 个答案:

答案 0 :(得分:13)

二维数组方法

您也可以将innerText刮成代表您的表格的二维数组

[
  ['A1', 'B1', 'C1'], // Row 1
  ['A2', 'B2', 'C2'], // Row 2
  ['A3', 'B3', 'C3']  // Row 3
]

page。$$ eval()

const result = await page.$$eval('#example-table tr', rows => {
  return Array.from(rows, row => {
    const columns = row.querySelectorAll('td');
    return Array.from(columns, column => column.innerText);
  });
});

console.log(result[1][2]); // "C2"

page.evaluate()

const result = await page.evaluate(() => {
  const rows = document.querySelectorAll('#example-table tr');
  return Array.from(rows, row => {
    const columns = row.querySelectorAll('td');
    return Array.from(columns, column => column.innerText);
  });
});

console.log(result[1][2]); // "C2"

答案 1 :(得分:12)

实现此目的的一种方法是使用evaluate,首先获取所有TD's的数组,然后返回每个TD的textContent

const puppeteer = require('puppeteer');

const html = `
<html>
    <body>
      <table>
      <tr><td>One</td><td>Two</td></tr>
      <tr><td>Three</td><td>Four</td></tr>
      </table>
    </body>
</html>`;

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(`data:text/html,${html}`);

  const data = await page.evaluate(() => {
    const tds = Array.from(document.querySelectorAll('table tr td'))
    return tds.map(td => td.innerHTML)
  });

  //You will now have an array of strings
  //[ 'One', 'Two', 'Three', 'Four' ]
  console.log(data);
  //One
  console.log(data[0]);
  await browser.close();
})();

您还可以使用以下内容: -

const data = await page.$$eval('table tr td', tds => tds.map((td) => {
  return td.innerHTML;
}));

//[ 'One', 'Two', 'Three', 'Four' ]
console.log(data);