遍历页面中的链接,然后根据条件单击

时间:2019-05-22 13:26:01

标签: javascript node.js puppeteer

我正在抓取网页,我只需要下载该页面上符合特定条件的文件。我该如何在puppeteer中做到这一点?

我可以使用选择器定位元素,并使用page.$$eval来获取所需的属性,但是我无法弄清楚如何单击该链接。

const sectionLinks = await page.$$eval('#mainsection a', aTags => aTags.map(a => a.innerText));
  for (const sectionLink of sectionLinks) {
    if (sectionLink.toUpperCase() == 'THEONEIWANT') {
      console.log('download');
      //this is where I want to click the link
    }
  }

1 个答案:

答案 0 :(得分:1)

您没有得到元素句柄。您只返回它们的innerText值。

您可以做的是,首先获取所有元素,然后像这样遍历它们:

const elements = await page.$$('#mainsection a');
for (const el of elements) {
    const innerText = await page.evaluate(el => el.innerText, el);
    if (innerText.toUpperCase() == 'THEONEIWANT') {
        await el.click();
    }
}

这将一个接一个地遍历所有元素,读取它们的innerText值,检查条件是否匹配,然后单击它。

优化

如果链接很多,这可能需要一些时间。您可以通过使用根据您要查找的文本进行匹配的选择器(请查看this question以获得更多信息)或使用类似以下的表达式来检查条件是否在客户端上匹配,来改进此代码。这将立即检查所有元素:

const shouldElementBeClicked = page.evaluate((...args) => args.map(el => el.innerText === '...'), ...elements);

这将导致一个带有布尔值的数组,该布尔值表示elements数组中相同位置的元素是否满足条件。