


构建网页正文提取工具,并排查正文丢失的原因
在构建或修复能在浏览器、服务器、命令行和边缘环境中提取网页正文的工具时使用。保持清理步骤的顺序,记录每一次移除,防止通过页面HTML注入脚本,并用先失败的小型测试证明修复有效。
要使用这个AI规则
## 让提取工具在每个支持的环境中表现一致
围绕稳定的文档接口设计提取器,而不是依赖某一种浏览器实现。
更改共享解析行为前,列出所有受支持的环境及其约束。
- 浏览器构建可以使用原生文档模型。
- 服务器构建可以接受由不同DOM实现创建的文档,并可提供异步API。
- 命令行构建必须保持相同的提取语义,同时提供机器可读模式和面向文本的模式。
- 边缘运行环境可能采用约束最严格的文档实现,应以此确定兼容性的最低标准。
- 即使模块格式不同,各个软件包入口也必须提供相同的公开行为。
保持环境适配器精简。
除非运行环境限制要求明确的例外,否则应将解析、评分、规范化、净化和元素专用行为放在共享层。
## 保持清理步骤的顺序,不为单个网站重新排序
将提取流水线视为有序算法,而不是一组可以任意交换的清理函数。
每个阶段都可能建立供后续阶段使用的前提。
默认采用以下顺序:
1. 展平封装的文档树。
2. 解析流式或延迟加载的内容。
3. 自动选择正文,或通过显式选择器指定正文。
4. 先规范化那些可能被移除规则隐藏或丢弃的结构。
5. 将识别出的提示块转换为稳定的语义表示。
6. 移除尺寸过小的媒体和隐藏元素。
7. 移除低评分块。
8. 应用完全匹配和部分匹配的干扰元素选择器。
9. 移除重复的样板文字和其他内容模式。
10. 规范化剩余文档。
11. 解析相对链接和资源位置。
当阶段之间的依赖关系并不明显时,应记录一个阶段必须先于另一个阶段的原因。
在为某个网站修复问题而重排共享阶段前,必须通过有针对性的测试证明新顺序仍保留所有必需的中间表示。
## 通过移除记录找出正文在哪一步丢失
提供调试模式,报告选中的内容根节点,以及每次移除对应的阶段、选择器、原因和代表性文本。
调试模式可以保留诊断属性,并跳过会抹去证据的结构展平操作。
预期内容消失时:
1. 在移除日志中查找缺失的内容。
2. 每次禁用一个阶段,找出最先导致内容丢失的阶段。
3. 如果问题来自选择器,区分完全匹配选择器与部分匹配选择器。
4. 选择了错误的根节点时,使用显式选择器绕过自动检测。
5. 确认受保护的代码区域或预格式化区域不会被通用移除规则处理。
6. 接受修复前,重新启用所有无关阶段。
相比根据最终文档进行猜测,应优先采用最早出现错误的转换所提供的证据。
如果通过范围明确的选择器、顺序或元素规则能够解决缺陷,就不得永久禁用大范围清理行为。
## 把页面HTML当作恶意输入,防止脚本注入
通过不会执行脚本或加载资源的安全文档构建辅助函数解析标记。
绝不能把不可信标记直接赋给浏览器的解析入口。
- 从链接和媒体属性中移除可执行脚本的URL协议。
- 从框架中移除嵌入文档的源内容。
- 移除事件处理器属性。
- 将所有页面来源的值插入生成的标记前,必须逐一转义。
- 当创建节点和设置属性能使转义要求更明确时,应优先使用这些方式。
- 将最终结果净化作为最后一道防线,而不能以此代替安全构建。
应假定媒体URL、替代文本、元数据图像和描述中的攻击者可控引号能够提前结束属性并注入新属性。
每个生成标记的提取器都必须具有恶意属性注入测试。
## 用先失败的最小测试页面证明修复有效
对于提取缺陷,创建仍能复现问题的最小文档测试样本,并配对精确的预期结果。
测试样本必须具有确定性,且不包含个人身份信息或来源特有标识。
- 用通用占位符替换真实姓名、电子邮件地址、URL、账户标识符和可识别文本。
- 仅包含触发失败流水线阶段所必需的结构。
- 对于安全修复,应包含恶意属性或等效的对抗性载荷。
- 应用修复前,确认测试样本会失败。
- 应用能让测试样本通过的最小行为更改。
- 在所有受支持的环境中运行目标测试样本和共享提取测试套件。
如果一个测试样本在实现更改前后都能通过,它就不能证明回归问题已经修复。
如果还原修复并不现实,应构造预期结果或受控开关,继续证明旧行为会失败。
## 测试各环境中DOM和打包方式的差异
即使共享算法没有变化,也要测试文档实现和软件包格式存在差异的边界行为。
- 修改文档前,将动态元素集合转换为静态数组。
- 验证在只公开默认导出的软件包中,命名工具仍然可以访问。
- 分别测试异步服务器适配器和同步浏览器适配器。
- 通过实际请求边界测试边缘运行环境的行为,不要假定它与浏览器相同。
- 使用同一组测试样本验证命令行的文本模式和结构化模式。
- 将特定环境的变通方案限制在适配器内,并为每一项提供有针对性的兼容性测试。
如果特定环境的修复改变了共享结果,应将其视为跨环境行为更改,并验证所有受支持的适配器。
不得让打包变通方案悄然重新定义提取器的公开契约。
