web-dev-qa-db-fra.com

Vous voulez gratter la table en utilisant puppeteer.js. Comment puis-je obtenir toutes les lignes, parcourir les lignes, puis obtenir des «td» pour chaque ligne

J'ai une configuration js de marionnettiste et j'ai pu obtenir toutes les lignes en utilisant

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

Maintenant, je veux que chaque ligne obtienne des "td" et puis obtienne le texte intérieur de ceux-ci.

Fondamentalement, je veux faire ceci:

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

où myRow est une ligne de table, avec puppeteer.js

7
user838426

Une façon d'y parvenir consiste à utiliser evalu qui obtient d'abord un tableau de tous les TD's renvoie ensuite le textContent de chaque 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.innerHTML)
  });

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

Vous pouvez également utiliser quelque chose comme: -

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

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