Получение странного вывода при очистке некоторых табличных данных - PullRequest
0 голосов
/ 13 октября 2018

Я создал скрипт, использующий node.js в сочетании с puppeteer для очистки некоторых табличных данных с веб-сайта.Хотя данные, которые я получаю, не генерируются динамически, я все же использовал puppeteer.

Однако, когда я выполняю свой скрипт, я получаю вывод в виде одного столбца, а не списка.Причем разбираются только имена и больше ничего.Ниже я привел два примера, чтобы уточнить, что я имел в виду.

Ссылка на сайт

Это то, что я пробовалпока что:

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 голосов
/ 13 октября 2018

Вместо 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);
  }
})();

Примечание: Обязательно используйте оператор await перед page.waitForSelector() и browser.close(), так как они оба возвращают обещания.

...