使用Mozilla Readability无法获取部分网站innerHTML的技术求助
解决mozilla/readability提取特定网站内容失败的方案
针对你提到的anghami法律页、naver博客页提取失败的问题,可通过以下具体措施解决:
1. 模拟真实浏览器请求头获取原始HTML
很多网站会拦截非浏览器标识的请求,导致返回的HTML不完整或为空。请求网页时必须带上完整的浏览器请求头:
// 示例:用axios请求时添加头 const axios = require('axios'); const headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Referer': 'https://www.google.com/' }; const inputResponse = await axios.get('https://www.anghami.com/legal', { headers });
2. 处理动态渲染的内容
Naver博客、部分anghami页面依赖前端JS动态生成内容,JSDOM默认不执行JS,导致解析的DOM为空。有两种方案:
方案A:开启JSDOM的JS执行(风险较高)
修改JSDOM初始化配置,允许执行脚本:
let dom = new JSDOM(inputResponse.content, { url: "https://www.anghami.com/legal", runScripts: "dangerously", // 允许执行页面JS resources: "usable" // 加载外部资源(如脚本、样式) }); // 等待JS执行完成(需手动延迟或监听事件) await new Promise(resolve => setTimeout(resolve, 2000)); let article = new Readability(dom.window.document).parse();
方案B:用Puppeteer渲染完整页面(更可靠)
直接用无头浏览器渲染页面后获取完整HTML:
const puppeteer = require('puppeteer'); const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.setExtraHTTPHeaders(headers); // 同上请求头 await page.goto('https://blog.naver.com/anupdown/221361918901', { waitUntil: 'networkidle2' }); const html = await page.content(); await browser.close(); // 再用JSDOM+Readability解析 let dom = new JSDOM(html, { url: 'https://blog.naver.com/anupdown/221361918901' }); let article = new Readability(dom.window.document).parse();
3. 调整Readability的解析参数
针对部分网站的特殊DOM结构,可修改Readability的配置项优化解析:
let article = new Readability(dom.window.document, { debug: true, // 打印解析日志,排查问题 maxElemsToParse: 10000, // 提高最大解析元素数,避免大页面被截断 keepClasses: true, // 保留原始类名,辅助调试 }).parse();
4. 修复不规范的HTML结构
部分网站的HTML存在语法错误,导致JSDOM解析异常。可先清理HTML:
const cheerio = require('cheerio'); const $ = cheerio.load(inputResponse.content); // 移除冗余节点,保留核心内容区 $('script, style, iframe').remove(); const cleanedHtml = $.html(); let dom = new JSDOM(cleanedHtml, { url: targetUrl }); let article = new Readability(dom.window.document).parse();
内容的提问来源于stack exchange,提问作者Sunil
相关产品推荐
相关产品推荐

