收集表格数据时获取奇怪的输出

时间:2018-10-13 16:40:03

标签: javascript node.js web-scraping html-table puppeteer

我已经使用node.jspuppeteer结合创建了一个脚本,以从网站中抓取一些表格数据。尽管我要处理的数据不是动态生成的,但我仍然使用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 个答案:

答案 0 :(得分:2)

您应该使用elementHandle.$eval()而不是elementHandle.$$eval()来获得所有td元素的数组,而不仅仅是第一个元素。

使用elementHandle.$$eval(),您可以将innerText映射到td元素的数组中,并返回结果。

'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);
  }
})();
  

注意:请确保在awaitpage.waitForSelector()之前使用browser.close()运算符,因为它们都返回承诺。