【问题标题】:Node/Puppeteer: trying to get all links using selector, getting attribute of resultsNode/Puppeteer:尝试使用选择器获取所有链接,获取结果属性
【发布时间】:2020-03-11 19:41:22
【问题描述】:

我是 puppeteer 的新手,我对 javascript 有点熟悉。我正在编写一个基于节点的程序。我遇到了一些奇怪的行为,我认为我只是在做一些愚蠢的事情。我加载了一个谷歌图片搜索结果页面,并尝试使用选择器“a.islib”获取所有结果链接。此选择器在浏览器/开发工具中正常工作。在我的程序中,我正在做:

const links = await page.$$eval('a.islib', as => as.map(a => a.href));

数组条目的数量是正确的,但它们都是空字符串。我切换到这个只是为了看看发生了什么:

const links = await page.$$eval('a.islib', as => as.map(a => a));

第一个条目是"__jsaction":{"click":"J9iaEb"},它是第一个锚元素的属性之一。为什么它不返回完整的锚元素本身?!

提前致谢。 (P.S. 我好像用的是 puppeteer 1.20 版。)

ETA:这是我正在处理的链接:

https://www.google.com/search?q=dogs&hl=en&tbm=isch&tbs=rimg:CVk7HmLev_17XImDPO8esV0arKADKdM7jqM7dCa_1-61MenSKaBTjYm-qrRUA5ZBN55gHxKypVIfrnXZb0_1rIufBzLXmFELBm6_1vytevXlQkwmJqMP1Necxlbne6zAfmCcFk1wEP9DLWWljV0qEgnPO8esV0arKBEjPzeqLvmlKSoSCQDKdM7jqM7dEcto8VTESawhKhIJCa_1-61MenSIRIe3dPxnC54YqEgmaBTjYm-qrRRGEiFoX72OrQSoSCUA5ZBN55gHxEc5qRFT4QSO7KhIJKypVIfrnXZYR_1RulX7C8TYQqEgn0_1rIufBzLXhEsefAUHeutqyoSCWFELBm6_1vytEcto8VTESawhKhIJevXlQkwmJqMRuHNtQBKeSY0qEgkP1NecxlbnexFS8G2tqKwyOioSCazAfmCcFk1wESYDiIqo6UMbKhIJEP9DLWWljV0RNcI2y-eGBPdhxHWgL7B9uK8&tbo=u&sa=X&ved=2ahUKEwjZ0-izmJXoAhVOqZ4KHckfBhwQrnZ6BAgBEBc

这是我使用 a.islib 选择器获得的第一个元素(删除了大部分图像数据以使其保持简短)。我的代码正在提取下面列出的 jsaction 属性。

<a class="wXeWr islib nfEiy mM5pbd" jsname="sTFXNd" jsaction="click:J9iaEb;" data-nav="1" tabindex="0" style="height: 159px;"><div class="bRMDJf islir" jsname="DeysSe" style="width: 283px; height: 159px; margin-right: -14px;" jsaction="mousedown:npT2md; touchstart:npT2md;"><img class="rg_i Q4LuWd tx8vtf" src="data:image/jpeg;base64,/9j/4AA..." data-deferred="1" jsname="Q4LuWd" alt="Image result for dogs" data-iml="639.485000167042" data-atf="true"></div><div class="c7cjWc"></div><div class="h312td " jsname="bOERI"><span class="gRqDMe "><div class="lMSpef"><div class="O1vY7" aria-label="Click for video information"><span class="I1wio LyzHgf"><svg viewBox="0 0 24 24" focusable="false" class="MbCJkd" height="12" width="12"><path d="M0 0h24v24H0z" fill="none"></path><path d="M8 5v14l11-7z"></path></svg></span><span class=" RtIwE">13:12</span></div></div></span></div><div class="PiLIec" jsaction="click: gFs2Re"></div></a>

ETA2:这里没有href。尽管如此,我上面的第二个等待行似乎应该返回整个元素。给定选择器'a.islib',我将如何获取它们的数组,然后我可以从中单击它或提取像href这样的属性? TIA。

【问题讨论】:

  • 能否包含您正在报废的目标网址,您确定该元素具有 href 属性吗?
  • 我已更新我的帖子以包含我正在处理的链接和元素。谢谢。
  • 我在没有实际处理您的评论的情况下更新了我的帖子。它确实没有href。这是预期的行为吗?我的第二个等待行没有返回 元素本身,这似乎仍然很奇怪。
  • 有趣的是:在谷歌图像搜索结果页面中,图像的 href 似乎只有在您单击它以显示右侧的黑色“详细信息”框时才会被填充。我没有意识到这一点,显然点击了一个,这让我误以为他们立即就在那里。

标签: javascript puppeteer


【解决方案1】:

这就是我所做的,以供任何人启迪。这将获取元素,单击它们(在这种情况下将更新 href),然后获取 href。似乎对我有用,希望是正确的方法。

 const links = await page.$$('a.islib', as => as.map(a => a));
 for (const link of links) {
    await link.click();
    const updatedHref = await page.evaluate(a => a.href, link);
 }

【讨论】:

    猜你喜欢
    • 2019-09-11
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2018-09-10
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多