【问题标题】:Want to scrape table using Puppeteer. How can I get all rows, iterate through rows, and then get "td's" for each row?想用 Puppeteer 刮桌子。如何获取所有行,遍历行,然后为每一行获取“td”?
【发布时间】: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。

【问题讨论】:

    标签: javascript html node.js puppeteer headless-browser


    【解决方案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 中)
      猜你喜欢
      • 1970-01-01
      • 2014-02-03
      • 2016-02-26
      • 2019-01-26
      • 2019-05-12
      • 1970-01-01
      • 2019-03-25
      • 2023-03-22
      • 2020-10-22
      相关资源
      最近更新 更多