如何从 iframe (puppeteer) 中获取多个 a 标签 href 链接(以数组的形式)?
how do I get multiple a tag href links (in form of an array) from inside an iframe (puppeteer)?
编码方面的新手,这就是为什么这个问题可能很容易回答的原因,但是在互联网上搜索了 2 天后仍然没有真正的解决方案,我想我只是在这里问一下。
因此,正如标题所解释的那样,我在一个网站中有一个 iframe,我想使用 id 属性(我们将其称为 iframeid)和此内部的某处iframe 我有一个带有 class 属性的 div 容器(我们将其称为 divclass),其中包含 - 除了其他元素 - 多个 <a>
标签。我的目标是获得一个数组,其中列出了那些 <a>
标签中的所有 link,到目前为止,我仅通过研究和一点运气实现了以下目标:
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>
标记的 link,但我无法弄清楚如何将其放入循环中,除此之外, <a>
标签的数量各不相同,这让我的代码循环变得更加困难。
难道就不能完全省去循环吗?我发现了类似的 Whosebug 问题,但例如只有一个 <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);
虽然它确实会抽出一些奇怪的其他 link,但我只是正常地过滤掉它们。
据我所知,每个 iframe 都可以被视为不同的页面。这是我用于相同类型任务的参考
编码方面的新手,这就是为什么这个问题可能很容易回答的原因,但是在互联网上搜索了 2 天后仍然没有真正的解决方案,我想我只是在这里问一下。
因此,正如标题所解释的那样,我在一个网站中有一个 iframe,我想使用 id 属性(我们将其称为 iframeid)和此内部的某处iframe 我有一个带有 class 属性的 div 容器(我们将其称为 divclass),其中包含 - 除了其他元素 - 多个 <a>
标签。我的目标是获得一个数组,其中列出了那些 <a>
标签中的所有 link,到目前为止,我仅通过研究和一点运气实现了以下目标:
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>
标记的 link,但我无法弄清楚如何将其放入循环中,除此之外, <a>
标签的数量各不相同,这让我的代码循环变得更加困难。
难道就不能完全省去循环吗?我发现了类似的 Whosebug 问题,但例如只有一个 <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);
虽然它确实会抽出一些奇怪的其他 link,但我只是正常地过滤掉它们。
据我所知,每个 iframe 都可以被视为不同的页面。这是我用于相同类型任务的参考