如何使用Puppeteer仅获取页面的标题与核心内容?
如何抓取任意网页的核心内容(GetPocket克隆场景)
嘿,我正好有几个实用的方案帮你解决这个核心内容提取的问题——毕竟做GetPocket克隆,自动识别纯净内容是关键环节!
用成熟的内容提取库省力气
既然你已经在用Puppeteer,强烈推荐搭配专门的内容提取工具,比如Node.js生态里的@mozilla/readability(就是Firefox阅读器背后的核心算法)。这类库不需要你预先知道目标网页的CSS类,会自动通过分析页面结构、段落密度、元素位置等识别核心内容区域。
给你个快速上手的代码示例:const puppeteer = require('puppeteer'); const { Readability } = require('@mozilla/readability'); const { JSDOM } = require('jsdom'); async function extractCleanContent(url) { const browser = await puppeteer.launch(); const page = await browser.newPage(); // 等待页面加载稳定,避免内容未渲染完全 await page.goto(url, { waitUntil: 'networkidle2' }); // 获取完整页面HTML const pageHtml = await page.content(); // 用JSDOM解析后交给Readability处理 const dom = new JSDOM(pageHtml, { url }); const reader = new Readability(dom.window.document); const cleanArticle = reader.parse(); // 这里就能拿到过滤后的标题和核心内容了 console.log('纯净标题:', cleanArticle.title); console.log('核心内容HTML:', cleanArticle.content); await browser.close(); return cleanArticle; }自定义逻辑应对特殊页面
要是遇到某些结构怪异的网页,现成库提取效果不理想,可以结合Puppeteer做一些简单的自定义判断:- 通过
page.evaluate()遍历页面所有<p>标签,统计每个父元素的段落数量,核心内容区通常段落最多 - 主动排除带
nav、footer、sidebar、widget这类关键词的元素(通过class或id判断) - 最后清理掉内容里的脚本、样式标签,只保留纯文本或结构化的HTML
- 通过
把提取的内容转成Markdown
拿到核心内容的HTML后,用turndown库就能轻松转成Markdown格式:const TurndownService = require('turndown'); const turndownService = new TurndownService(); // 承接上面的示例,把HTML转成Markdown const markdownContent = turndownService.turndown(cleanArticle.content);
这些方法组合起来,基本能覆盖绝大多数任意URL的抓取需求,不用再头疼每个网站的不同结构啦!
内容的提问来源于stack exchange,提问作者The.Wolfgang.Grimmer
相关产品推荐
相关产品推荐

