想用 Puppeteer 刮桌子。如何获取所有行,遍历行,然后为每一行获取“td”?

Posted

技术标签:

【中文标题】想用 Puppeteer 刮桌子。如何获取所有行,遍历行,然后为每一行获取“td”?【英文标题】:Want to scrape table using Puppeteer. How can I get all rows, iterate through rows, and then get "td's" for each row? 【发布时间】:2018-08-20 13:50:11 【问题描述】:

我有 Puppeteer 设置,并且我能够使用以下方法获取所有行:

let rows = await page.$$eval('#myTable tr', row => row);

现在我想为每一行获取“td's”,然后从中获取innerText

基本上我想这样做:

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

myRow 是一个表格行,带有 Puppeteer。

【问题讨论】:

【参考方案1】:

实现此目的的一种方法是使用评估,它首先获取所有TD's 的数组,然后返回每个TD 的文本内容

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.innerText)
  );

  //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.innerText;
));

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

【讨论】:

【参考方案2】:

二维数组法

您还可以将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"

【讨论】:

您的回答帮助了我。但就我而言,我必须使用column.textContent 而不是column.innerText,否则我会返回空白单元格。 这产生了许多完整的数组 \n \n \n \n :((在 booking.com 中)

以上是关于想用 Puppeteer 刮桌子。如何获取所有行,遍历行,然后为每一行获取“td”?的主要内容,如果未能解决你的问题,请参考以下文章

facebook广告间谍工具是如何刮取数据的?

如何获取 Puppeteer 访问的页面的所有 DOM 元素上的所有事件 - 基本上是 getEventListeners

美丽的汤和桌子刮 - lxml 与 html 解析器

使用 Puppeteer 如何从目录上传随机文件并将其删除?

Puppeteer之爬虫入门

Puppeteer之爬虫入门