我正在尝试使用 Playwright 解析页面。
该页面有一个表,每行都包含数据,其中包括我想让剧作家转到的 URL,获取额外信息,然后将其添加到我要保存的行对象中。
它工作正常,直到我添加代码来访问 newPage,在这种情况下我得到一个空数组。
我有一种感觉,这与在地图函数中使用
await
有关?有人可以提供一些指导吗?
const browserType = "chromium";
const url = "https://page-with-table.html";
const browser = await playwright[browserType].launch();
const context = await browser.newContext();
const page = await context.newPage();
await page.goto(url);
const tableRowsLocator = page.locator("table tr");
const tableData = await tableRowsLocator.evaluateAll(async (tableRows) => {
const data = [];
tableRows.map(async (tableRow) => {
const rowObject = {};
const rowData = tableRow.querySelector('td[data="rowData"]');
const url = tableRow.querySelector('td[data="url"] a');
// --- Problem code begins
const newPage = await context.newPage();
await newPage.goto(url);
const contentLocator = newPage.locator("#content");
const contentData = await contentLocator.evaluate(async (content) => {
return content.textContent;
});
rowObject.content = newPageData;
await newPageData.waitForTimeout(1000);
await newPageData.close();
// --- Problem code ends
rowObject.rowData = rowData.textContent;
rowObject.url = url.getAttribute("href");
data.push(rowObject);
});
return data;
});
await page.waitForTimeout(1000);
await browser.close();
console.log(gamesData);
不要在 Playwright 中将 map、forEach 等与 async 一起使用。
const tableRowsLocator = page.locator("table tr");
const tableData = await tableRowsLocator.all();
for (const tableRow of tableData) {
const rowData = tableRow.locator('td[data="rowData"]');
const url = tableRow.locator('td[data="url"] a');
// your code
}