使用cheerio(使用puppeteer)提取链接

Posted

技术标签:

【中文标题】使用cheerio(使用puppeteer)提取链接【英文标题】:Extract links using cheerio (with puppeteer) 【发布时间】:2022-01-01 02:39:21 【问题描述】:

我正在使用 puppeteer 和 Cheerio,对此我很陌生。 这里是相关的html页面源代码sn-p:

<section class="descr">
  <div class="center">
    <a class="mfp-image" href="https://site.pics/store/1234/cat/img.jpg" title="Full size: 642x642" target="_blank"><img class="lazy 123" src="/assets/images/blank.gif" data-src="https://site.pics/store/1234/cat/th_img.jpg" ></a>
  </div>
  <div class="info">JPG | 500px | 1MB 22.11.2021</div>
  <hr id='more-3948099'>
  <br>
  <div class="blockSpoiler dl-links"><span class="fixHeader" id="download-links"></span><i class="sa sa-download-spoiler pl1em"></i><span class="blockTitle pl0">Get from file storage </span></div>
  <div class="blockSpoiler-content txtleft c-dl-links"><a rel="external nofollow noopener" href="https://link1.net/file/a8eaa368334d6214a03e0e648f6e55d4/ssic4Bl4nkin.html" target="_blank">HOST1</a>
    <br><a rel="external nofollow noopener" href="https://link2.file/view/EB54B4FD06B9297/ssic4Bl4nkin" target="_blank">HOST2</a>
    <br><a rel="external nofollow noopener" href="http://www.link3.com/file/3xdhcvtkfnh4/fjJ3ssic4Bl4nkin" target="_blank">HOST3</a>
    <br><a rel="external nofollow noopener" href="https://www.link4.com/riwtuwz9vjr3" target="_blank">HOST4</a>
    <br>
  </div>

我需要这些链接:

    https://site.pics/store/1234/cat/img.jpg https://link1.net/file/a8eaa368334d6214a03e0e648f6e55d4/ssic4Bl4nkin.html https://link2.file/view/EB54B4FD06B9297/ssic4Bl4nkin http://www.link3.com/file/3xdhcvtkfnh4/fjJ3ssic4Bl4nkin https://www.link4.com/riwtuwz9vjr3

请注意,在某些情况下也可能存在链接5(本例中未显示)

我在 Chrome 开发者工具中使用了这段代码:

document.querySelector("div.blockSpoiler-content.txtleft.c-dl-links").innerHTML

document.querySelector("div.blockSpoiler-content.txtleft.c-dl-links").outerHTML

我可以获得很多包含所需内容的文本,以及不需要的文本。我已经尝试了几个小时以上,但无法取得更多进展。

当我使用cheerio 编写代码时,我没有得到任何有用的输出:

const html = await page.content(); const $ =cheerio.load(html); console.log($("div.blockSpoiler-content.txtleft.c-dl-links")); console.log($("div.blockSpoiler-content.txtleft.c-dl-links").innerHTML); console.log($("div.blockSpoiler-content.txtleft.c-dl-links").outerHTML);

感谢任何帮助。

【问题讨论】:

同时使用 Cheerio 和 Puppeteer 有什么意义? Puppeteer 已经有一个实时的 HTML 解析器和选择器;它在功能上是 Cheerio 的超集。 @ggorlen 你之前提到过,有些人只是更喜欢 Cheerio,它有一些有用的功能(例如嘶嘶声伪)。您也可以在调试器中评估事物,因为它不是异步的。 @pguardiario 是的,我仍然不相信。大多数使用这两种方法的问题对我来说质量都很低,我怀疑他们使用的是调试器或嘶嘶声选择器。对我来说似乎是xy situation——举证责任似乎是“为什么是cheerio”而不是“为什么不是cheerio”。您正在重新解析整个 DOM,并创建了 Cheerio 状态与实时页面不同步的情况。您是否有任何专家参考资料可以帮助我理解(或为什么)这是“一件事”?我很乐意纠正。 @ggorlen 你这样做了一次,而不是多次 cdp 访问浏览器并返回。有时这样会更好,有时你不需要 dom 更新。但对我来说,主要是调试器。 【参考方案1】:

这应该会有所帮助。

const $ = cheerio.load(html);
var urls = $('a[href]').map(function() return $(this).attr('href') || '';).toArray();
console.log('urls', urls);

【讨论】:

【参考方案2】:

不过,在这种情况下,使用 puppeteer 会更好:

let urls = await page.$$eval('a', as => as.map(a => a.href))

【讨论】:

以上是关于使用cheerio(使用puppeteer)提取链接的主要内容,如果未能解决你的问题,请参考以下文章

nodejs cheerio模块提取html页面内容

如何在 Google Apps 脚本中使用 Cheerio 提取 HTML 表格数据(雅虎财经)?

使用cheerio在没有孩子的父母中获取文本

如何使用nodejs模块使用xpath提取html内容

我可以在 node.js 中使用cheerio 包加载本地 html 文件吗?

带有cheerio和请求的节点js中的增量和非增量url