抓取一些表格数据时得到奇怪的输出
Getting Weird Output While Scraping Some Tabular Data
我创建了一个脚本,使用 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']
而不是 elementHandle.$eval()
, you should be using elementHandle.$$eval()
获取所有 td
元素的数组,而不仅仅是第一个元素。
使用 elementHandle.$$eval()
,然后您可以将 innerText
映射到 td
元素的数组中,然后 return 结果。
'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);
}
})();
Note: Make sure to use the await
operator before page.waitForSelector()
and browser.close()
, as they both return promises.
我创建了一个脚本,使用 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']
而不是 elementHandle.$eval()
, you should be using elementHandle.$$eval()
获取所有 td
元素的数组,而不仅仅是第一个元素。
使用 elementHandle.$$eval()
,然后您可以将 innerText
映射到 td
元素的数组中,然后 return 结果。
'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);
}
})();
Note: Make sure to use the
await
operator beforepage.waitForSelector()
andbrowser.close()
, as they both return promises.