javascript - 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 </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 </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 </td>//VALUE
</tr>
<tr class="dark">
<td style="text-align: right; width: 100px;"><strong>User:</strong></td>//HEADER
<td valign="top">fbibsan </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) </td> //VALUE
</tr>
<tr class="dark">
<td style="text-align: right; width: 100px;"><strong>Mode:</strong></td>//HEADER
<td valign="top">FAF </td>//VALUE
</tr>
<tr class="light">
<td style="text-align: right; width: 100px;"><strong>Type:</strong></td>
<td valign="top">BOP </td>
</tr>
</tbody>
我需要的结构是表中的每一行:
HEADER:'VALUE'
我希望有人能帮忙。我将非常感激,因为我现在已经花了几天时间寻找。
解决方案
取决于地图回调中您的 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;
}));