想使用 Puppeteer 抓取 table。如何获取所有行,遍历行,然后为每一行获取 "td's"?
Want to scrape table using Puppeteer. How can I get all rows, iterate through rows, and then get "td's" for each row?
我有 Puppeteer 设置,我可以使用以下方法获取所有行:
let rows = await page.$$eval('#myTable tr', row => row);
现在我希望每一行都得到“td
”,然后从中得到 innerText
。
基本上我想这样做:
var tds = myRow.querySelectorAll("td");
其中 myRow
是 table 行,带有 Puppeteer。
实现此目的的一种方法是使用评估,它首先获取所有 TD's
的数组,然后 returns 每个 TD
的 textContent
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);
二维数组法
您还可以将 innerText
拼凑成一个 二维数组 ,代表您的 table。
[
['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"
我有 Puppeteer 设置,我可以使用以下方法获取所有行:
let rows = await page.$$eval('#myTable tr', row => row);
现在我希望每一行都得到“td
”,然后从中得到 innerText
。
基本上我想这样做:
var tds = myRow.querySelectorAll("td");
其中 myRow
是 table 行,带有 Puppeteer。
实现此目的的一种方法是使用评估,它首先获取所有 TD's
的数组,然后 returns 每个 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);
二维数组法
您还可以将 innerText
拼凑成一个 二维数组 ,代表您的 table。
[
['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"