【问题标题】:how do I get multiple a tag href links (in form of an array) from inside an iframe (puppeteer)?如何从 iframe(puppeteer)中获取多个标签 href 链接(以数组的形式)?
【发布时间】:2021-12-25 05:44:48
【问题描述】:

对编码很陌生,这就是为什么这个问题可能很容易回答的原因,但是在扫描互联网 2 天后仍然没有真正的解决方案,我想我只是在这里问。

所以,正如标题所解释的,我在一个网站中有一个 iframe,我想用一个 id 属性(我们称之为 iframeid)来抓取它,在这个 iframe 的某个地方我有一个 div具有类属性(我们将其称为 divclass)的容器,除了其他元素之外,它还包含多个 <a> 标签。我的目标是获得一个数组,其中列出了来自这些 <a> 标记的所有链接,到目前为止,我只是通过研究和一点运气实现了以下目标:

const elementHandle = await page.waitForSelector('iframe#iframeid');
const frame = await elementHandle.contentFrame();
await frame.waitForSelector('div[class=divclass] a');
var x = 2; //a var to determine which a tag I want
const oneA= await frame.$('div[class=entryLayer] a:nth-child(' + x + ')');
const link = await (await oneA.getProperty('href'))._remoteObject.value;
console.log(link);

它的作用是接受一个变量并根据<a>标签提取其链接,但我不知道如何将其放入循环中,除此之外,<a>标签的数量各不相同,这使我的循环编码更加困难。

难道不可以完全省略循环吗?我发现了类似的 stackoverflow 问题,但例如一个只有一个 <a> 标记,这似乎完全改变了代码。

最后,我只想要一个我作为新手可以理解但同时又相当紧凑的工作代码。 感谢您提前提供帮助!

编辑

在评论的帮助下我的解决方案:

const elementHandle = await page.waitForSelector('iframe#iframeid');
const frame = await elementHandle.contentFrame();
const thisDiv = await frame.waitForSelector('div[class=divclass]');
const xpath_expression = '//a[@href]';
await page.waitForXPath(xpath_expression);
const links = await thisDiv.$x(xpath_expression);
const link_urls = await thisDiv.evaluate((...links) => {
    return links.map(e => e.href);
}, ...links);
console.log(link_urls);

虽然它确实会拉出一些奇怪的其他链接,但我只是将它们正常过滤掉。

【问题讨论】:

    标签: javascript node.js web-scraping iframe puppeteer


    【解决方案1】:

    据我所知,每个 iframe 都可以被视为不同的页面。这是我用于同类型任务的参考https://stackoverflow.com/a/54940865/17755263

    【讨论】:

    • 我无法通过/a/@href 快速工作来获得这个想法,您能否提供更具体的代码?除此之外,php(您的帖子)和 javascript(我的问题)之间是否有任何区别?
    • 我可以做到这一点,但你应该自己试试。提示:Javascript 是客户端。所以所有代码在 iframe 内和 iframe 外都会被平等对待
    • 好的,我稍后再详细试试,谢谢!
    • 我让它以某种方式工作,感谢您的提示!将我的解决方案添加到我的问题中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 2017-09-29
    • 2013-10-30
    • 1970-01-01
    • 2021-08-22
    • 2020-08-11
    相关资源
    最近更新 更多