代码之家  ›  专栏  ›  技术社区  ›  SIM

在抓取一些表格数据时得到奇怪的输出

  •  0
  • SIM  · 技术社区  · 6 年前

    我已经用 node.js 结合 puppeteer 木偶师

    然而,当我执行脚本时,我得到的是一列而不是一个列表中的输出。而且,只解析名称,其他什么都不解析。下面我举两个例子来说明我的意思。

    Website link

    这是我迄今为止尝试过的:

    const puppeteer = require("puppeteer");
    
    (async function main() {
      try {
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        await page.goto("https://fantasy.premierleague.com/player-list/");
        page.waitForSelector("table.ism-table");
        const data = await page.$$("table.ism-table tbody tr");
        for (const td of data) {
          const tdata = await td.$eval("td", item => item.innerText);
          console.log(tdata);
        }
        browser.close();
      } catch (e) {
        console.log("Here goes the error ", e);
      }
    })();
    

    De Gea  
    Ederson 
    Alisson 
    Kepa    
    Lloris
    Cech    
    Schmeichel  
    Grant
    

    我期望的输出:

    ['De Gea', 'Man Utd', '23', '£5.9']
    ['Ederson', 'Man City', '43', '£5.7']
    ['Alisson', 'Liverpool', '39', '£5.6']
    ['Kepa', 'Chelsea', '36', '£5.5']
    ['Lloris', 'Spurs', '20', '£5.4']
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Grant Miller    6 年前

    elementHandle.$eval() ,您应该使用 elementHandle.$$eval() td 元素,而不仅仅是第一个元素。

    元素句柄$$eval() ,然后可以映射 innerText 进入

    'use strict';
    
    const puppeteer = require('puppeteer');
    
    (async function main() {
      try {
        const browser = await puppeteer.launch();
        const page    = await browser.newPage();
    
        await page.goto('https://fantasy.premierleague.com/player-list/');
    
        await page.waitForSelector('table.ism-table');
    
        const data = await page.$$('table.ism-table tbody tr');
    
        for (const tr of data) {
          const tdata = await tr.$$eval('td', item => item.map(e => e.innerText));
          console.log(tdata);
        }
    
        await browser.close();
      } catch (e) {
        console.log('Here goes the error ', e);
      }
    })();
    

    注: 一定要使用 await 前操作员 page.waitForSelector() browser.close() 因为他们都回报了承诺。