首页 > 解决方案 > Puppeteer - 以正确的格式从表中抓取数据

问题描述

我一直在开发一个 puppeteer 应用程序来抓取一些数据。

我的代码运行良好,但可以改进以提供我想要改进的数据,以便以我可以使用的结构化方式获取数据。

const table1 = await page.$$eval('table:nth-child(3) tbody', tbodys => tbodys.map((tbody) => {
  return tbody.innerText;
}));

所以 tbody 允许我刮掉所有的 TR 和 TD 标签,无论表格中有多少标签,但是我的问题是我的表格有一个表格行,并且在该表格行中它有两个表格单元格。第一个 TD 是第二个 TD 中数据的头部。

所以我有以下HTML:

<tr class="header1"><th colspan="2">COS-MOD-000-CAB-PAP-123202</th></tr>

body > center > table > tbody > tr:nth-child(2) > td:nth-child(2) > div:nth-child(3) > table:nth-child(3) > tbody > tr:nth-child(2)

//THIS IS THE BODY WHICH MY ORIGINAL CODE IS PULLING OUT THE TEXT OF. MY CODE LOOKS AT TDS ONLY WITHIN TRs.
<tbody><tr class="header1"><th colspan="2">COS-MOD-000-CAB-PAP-123202</th></tr>
<tr class="light">
    <td style="text-align: right; width: 100px;"><strong>Status:</strong></td>//HEADER
    <td valign="top">Wrong&nbsp;</td> //VALUE
</tr>
<tr class="dark">
    <td style="text-align: right; width: 100px;"><strong>Created:</strong></td>//HEADER
    <td valign="top">2019-09-09 17:18:53&nbsp;</td>//VALUE
</tr>
<tr class="light">
    <td style="text-align: right; width: 100px;"><strong>Modified:</strong></td>//HEADER
    <td valign="top">2019-09-09 17:21:19&nbsp;</td>//VALUE
</tr>
<tr class="dark">
    <td style="text-align: right; width: 100px;"><strong>User:</strong></td>//HEADER
    <td valign="top">fbibsan&nbsp;</td>//VALUE
</tr>
<tr class="light">
    <td style="text-align: right; width: 100px;"><strong>BMS Account:</strong></td> //HEADER
    <td valign="top">ABC123 SAS. (SAS)&nbsp;</td> //VALUE
</tr>
<tr class="dark">
    <td style="text-align: right; width: 100px;"><strong>Mode:</strong></td>//HEADER
    <td valign="top">FAF&nbsp;</td>//VALUE
</tr>
<tr class="light">
    <td style="text-align: right; width: 100px;"><strong>Type:</strong></td>
    <td valign="top">BOP&nbsp;</td>
</tr>
</tbody>

我需要的结构是表中的每一行:

HEADER:'VALUE'

我希望有人能帮忙。我将非常感激,因为我现在已经花了几天时间寻找。

标签: javascriptweb-scrapingjavascript-objectspuppeteer

解决方案


取决于地图回调中您的 tbody 类型。希望你能以某种方式解析那个 tbody 对象。

我认为您只需要额外的解析,并且可能只需要向现有函数添加一些逻辑。

这是我要做的:

const table1 = await page.$$eval('table:nth-child(3) tbody', tbodys => tbodys.map((tbody) => {
  // add logic here!
  let parsedTable = '';
  let extractedTRs = tbody.match(/<tr>(.*?)<\/tr>/g); // find a way to deconstruct this or regex. what is the type of tbody?
  extractedTRs.map( tr => {
  const tr= str.match(/<td>(.*?)<\/td>/g); //this should return an array...someone check me :)
  parsedTable += `tr[0]:'${tr[1]}' \\n`); 
}
  
  return parsedTable;
}));

推荐阅读