【问题标题】:Puppeteer get cells in a rowPuppeteer 连续获取单元格
【发布时间】:2021-02-03 03:20:47
【问题描述】:

我需要用 puppeteer 刮一张桌子以获取所有单元格(行和单元格)。

表格是:

<table class="grilla" cellspacing="0" rules="all" border="1" id="ctl00_PlaceContent_gvConceptos" style="width:100%;border-collapse:collapse;">
            <tr class="grilla_head" align="center">
                <th scope="col">Concepto</th><th scope="col">Empresa</th><th scope="col">Descripción</th><th scope="col">Haberes</th><th scope="col">Deducciones</th>
            </tr><tr class="grilla_item separador">
                <td align="center" style="font-size:10pt;">001</td><td align="center" style="font-size:10pt;">001</td><td style="font-size:10pt;">P.B.U - PRESTACION BASICA UNIVERSAL</td><td align="right" style="font-size:10pt;">8144,14</td><td align="right" style="font-size:10pt;"></td>
            </tr>
                

        </table>

我设法使用此代码从框架中的表格中获取 html:

// Get the username and password inputs
const browser = await Apify.launchPuppeteer();
const page = await browser.newPage();
await page.goto("https://servicioscorp.anses.gob.ar/MiAnsesSitio/Sistemas/InvocaSistemas.aspx?IdMenu=10603");
// Login
await page.type('#Usuario', "user");
await page.type('#Clave',"key");
let n,x;
 for (n=0 ; n <= 3000 ; n++) { console.log(n)     }
await page.click('#Ingresar');
await page.waitForNavigation()
await page.click('#ctl00_MenuIzquierdo_rpt_MenuPadre_ctl05_lnk_Padre')
await page.click('#ctl00_MenuIzquierdo_rpt_MenuPadre_ctl05_rpt_MenuHijos_ctl02_lnk')
await page.waitForNavigation()
const frame = await page.frames().find(frame => frame.name() === 'ctl00_PlaceContent_icontenedor');
await frame.waitForSelector('#ctl00_PlaceContent_txtMes')
await frame.type('#ctl00_PlaceContent_txtMes','01');
await frame.type("#ctl00_PlaceContent_txtAnio","2021");
await frame.click("#ctl00_PlaceContent_btnConsultar");
await frame.waitForNavigation()
await frame.waitForSelector('#ctl00_PlaceContent_tlb_General_Grilla')
let element = await frame.$('#ctl00_PlaceContent_tlb_General_Grilla')
// Get inner text
const innerText = await frame.evaluate(() => document.querySelector('#ctl00_PlaceContent_tlb_General_Grilla').innerText);
// Get inner HTML
const innerHTML = await frame.evaluate(() => document.querySelector('#ctl00_PlaceContent_tlb_General_Grilla').innerHTML);
console.log(innerHTML)
console.log('Done.');

提前致谢

【问题讨论】:

  • 这里发生了很多事情。如果您能准确指出代码的哪一部分对您来说出了问题,那将会很有帮助。你到底希望得到什么输出?

标签: node.js web-scraping puppeteer


【解决方案1】:

如何将表格内容抓取为二维数组:

import puppeteer from 'puppeteer';

const browser = await puppeteer.launch(/* { headless: false, defaultViewport: null } */);

const html = `
  <!doctype html>
  <html>
    <head><meta charset='UTF-8'><title>Test</title></head>
    <body>
      <table>
        <tr><th>1</th><th>2</th></tr>
        <tr><td>a</td><td>b</td></tr>
      </table>
    </body>
  </html>`;

try {
  const [page] = await browser.pages();

  await page.goto(`data:text/html,${html}`);

  const data = await page.evaluate(() => {
    return Array.from(
      document.querySelector('table').rows,
      row => Array.from(row.cells, cell => cell.innerText),
    );
  });
  console.log(data); // [ [ '1', '2' ], [ 'a', 'b' ] ]
} catch(err) { console.error(err); } finally { await browser.close(); }

【讨论】:

  • 抱歉,控制台什么也没有
  • 您是完全使用这个示例还是根据您的情况对其进行调整?
  • 没有错误,只是一个空控制台?那很奇怪。您使用哪些 Node.js、Chrome 和 puppeteer 版本?您如何命名脚本以及如何运行它?
  • 对不起,我写在一个函数里面。现在工作完美。非常感谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
相关资源
最近更新 更多