【发布时间】: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