You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Puppeteer遍历HTML列表并提取span内容与a标签链接

如何用Puppeteer提取HTML列表中的文本与链接?

我来帮你搞定这个问题——你之前的代码里,page.$$只是获取页面上的元素句柄数组,没法直接通过回调函数提取内容。要拿到每个<li>里<span>和<a>的信息,咱们可以用Puppeteer提供的$$eval或者结合element.evaluate来实现,下面是两种实用方案:

方案1:用page.$$eval(简洁高效,适合批量提取)

$$eval可以直接对匹配到的所有元素执行处理函数,一次性返回整理好的结果数组,非常适合你这种批量提取列表内容的场景:

const puppeteer = require('puppeteer')
const main = async () => {
  const browser = await puppeteer.launch()
  const page = await browser.newPage()
  await page.goto('link-to-my-website')
  await page.waitForSelector("section[id='famous']");

  // 提取每个条目的类型、标题、上传信息及对应链接
  const movies = await page.$$eval('#famous > li.list-entry', entries => {
    return entries.map(entry => {
      // 定位每个span里的a标签
      const typeLink = entry.querySelector('.item-type a');
      const titleLink = entry.querySelector('.item-name.item-title a');
      const uploadedLink = entry.querySelector('.item-uploaded a');

      return {
        type: typeLink.innerText.trim(),
        typeUrl: typeLink.href,
        title: titleLink.innerText.trim(),
        titleUrl: titleLink.href,
        uploadedText: uploadedLink.innerText.trim(),
        uploadedUrl: uploadedLink.href
      };
    });
  });

  // 打印提取结果
  console.log('所有条目信息:', movies);
  // 也可以逐个条目打印,更清晰
  movies.forEach((item, idx) => {
    console.log(`\n第${idx+1}条:`);
    console.log(`类型:${item.type} | 链接:${item.typeUrl}`);
    console.log(`标题:${item.title} | 链接:${item.titleUrl}`);
    console.log(`上传信息:${item.uploadedText} | 链接:${item.uploadedUrl}`);
  });

  await browser.close()
}
main()

方案2:用page.$$配合element.evaluate(灵活可控,适合复杂操作)

如果之后你需要对每个元素做更复杂的处理(比如等待子元素加载、模拟点击等),可以先获取元素句柄数组,再逐个处理:

const puppeteer = require('puppeteer')
const main = async () => {
  const browser = await puppeteer.launch()
  const page = await browser.newPage()
  await page.goto('link-to-my-website')
  await page.waitForSelector("section[id='famous']");

  const movieElements = await page.$$('#famous > li.list-entry');
  const movies = [];

  for (const element of movieElements) {
    // 在每个元素的上下文里提取内容
    const itemData = await element.evaluate(el => {
      const typeLink = el.querySelector('.item-type a');
      const titleLink = el.querySelector('.item-name.item-title a');
      const uploadedLink = el.querySelector('.item-uploaded a');
      
      return {
        type: typeLink.innerText.trim(),
        typeUrl: typeLink.href,
        title: titleLink.innerText.trim(),
        titleUrl: titleLink.href,
        uploadedText: uploadedLink.innerText.trim(),
        uploadedUrl: uploadedLink.href
      };
    });
    movies.push(itemData);
  }

  console.log('所有条目信息:', movies);
  await browser.close()
}
main()

几个关键细节:

  • trim()用来去掉文本前后的空格,避免输出多余的空白字符;
  • 直接获取a标签的href属性时,Puppeteer会自动把相对链接转换成完整的绝对URL,不用手动拼接;
  • $$eval是在浏览器上下文执行函数,所以里面的代码不能直接访问Node.js环境的变量,这点要注意。

这样修改后,你就能得到包含每个条目文本和对应链接的数组了。

内容的提问来源于stack exchange,提问作者Aven Desta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 10:23:13