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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:35:13