【问题标题】:Scrape elements by name and their properties and then print them - Puppeteer按名称及其属性刮取元素,然后打印它们 - Puppeteer
【发布时间】:2020-07-20 19:31:24
【问题描述】:

我对 Puppeteer、node.js 和编程完全不熟悉,我有这个项目在我的脑海中。 There is a game website 您可以在其中发布待售物品。我想抓取此页面并打印出所有项目及其名称和属性,但不知道如何访问它们。

Website code looks like this.

红线是我想打印出来的。我试图至少获得项目的名称,但我得到的只是一个空数组:

const itemNames = await page.evaluate(() =>
        Array.from(document.getElementsByClassName('itemHeader doubleLine'))
            .map((partner) => partner.innerText.trim())
            )

    console.log(itemNames);
    await browser.close();

如何使用 Puppeteer 完成这项任务?感谢您的帮助。

【问题讨论】:

  • 尝试切换到document.querySelectorAll(".itemHeader.doubleLine")
  • 嗨@Karolis Gaivenis,如果您也共享HTML代码来说明您的问题,请确保将其粘贴为代码sn-p而不是屏幕截图,像这样的人愿意帮助您在本地重现您的场景。

标签: node.js web-scraping puppeteer


【解决方案1】:

你可以使用page.$$eval来获取匹配的元素:

page.$$eval(selector, pageFunction[, arg])

此方法在页面内运行Array.from(document.querySelectorAll(selector)),并将其作为第一个参数传递给pageFunction

然后,您可以使用 Array.map 遍历匹配元素的数组以检索它们的 innerText 属性。

例如:

await page.waitForSelector('.itemHeader.doubleLine')
const items = await page.$$eval('.itemHeader.doubleLine', itemElements => itemElements.map(i => i.innerText.trim()))

输出:

["Damnation Stride\nHydrascale Boots","Corruption Span\nCarnal Boots","Rift Span\nShagreen Boots","Storm Tread\nGoliath Greaves","Maelström Urge\nStrapped Boots","Maelström Tread\nIronscale Boots","Beast Hoof\nCarnal Boots","Ambush Road\nShackled Boots","Miracle Track\nVelvet Slippers","Brood League\nLeatherscale Boots"]

编辑

其实你的解决方案也是正确的。我很确定您的案例中缺少的是page.waitForSelector。在内容将在 DOM 中呈现之前定义 itemNames

await page.waitForSelector('.itemHeader.doubleLine')

【讨论】:

  • 非常感谢!你的回答真的很有帮助。所有 3 个解决方案都有效(getElementsByClassName、querySelectorAll、page.$$eval)。 @theDavidBarton 指出的问题是我缺少 page.waitForSelector
猜你喜欢
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
相关资源
最近更新 更多