1
0
Files
Skill/openspec/changes/archive/2026-03-08-create-lyxy-reader-html-skill/design.md
lanyuanxiaoyao 6b4fcf2647 创建 lyxy-reader-html skill
- 新增 skill: lyxy-reader-html,用于解析 HTML 文件和 URL 网页内容
- 支持 URL 下载(pyppeteer → selenium → httpx → urllib 优先级回退)
- 支持 HTML 解析(trafilatura → domscribe → MarkItDown → html2text 优先级回退)
- 支持查询功能:全文提取、字数统计、行数统计、标题提取、章节提取、正则搜索
- 新增 spec: html-document-parsing
- 归档 change: create-lyxy-reader-html-skill
2026-03-08 02:02:03 +08:00

125 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Context
当前项目已有 `lyxy-reader-office` skill 用于解析办公文档,其架构设计成熟,包含统一命令行入口、多解析器回退机制、多功能查询等特性。现在需要创建 `lyxy-reader-html` skill功能上类似但针对 HTML 内容,同时需支持 URL 下载能力。
**约束条件**
-`lyxy-reader-office` 保持相同的用户体验(参数、输出格式)
- 代码完全独立,不复用 `lyxy-reader-office` 的代码
- 参考 `temp/downloader/download.py``temp/parser/parse.py` 的现有实现
## Goals / Non-Goals
**Goals:**
- 创建完整的 `lyxy-reader-html` skill 目录结构
- 实现统一的命令行入口 `parser.py`,支持 URL 和 HTML 文件输入
- 实现下载器模块,按 pyppeteer → selenium → httpx → urllib 优先级回退
- 实现解析器模块,按 trafilatura → domscribe → MarkItDown → html2text 优先级回退
- 实现 HTML 预处理清理和 Markdown 后处理
- 实现与 `lyxy-reader-office` 一致的查询功能(全文、字数、行数、标题、章节、搜索)
**Non-Goals:**
- 不支持可配置的 HTML 清理选项
- 不支持 JavaScript 渲染开关(默认启用完整下载链)
- 不支持正文/全文切换(默认使用解析器的正文提取)
## Decisions
### 1. 目录结构参考 lyxy-reader-office
**决策**:采用与 `lyxy-reader-office` 相同的目录结构
```
lyxy-reader-html/
├── SKILL.md
├── scripts/
│ ├── parser.py # 统一入口
│ ├── common.py # 公共函数
│ ├── downloader.py # URL 下载
│ ├── html_parser.py # HTML 解析
│ └── README.md
└── references/
├── examples.md
├── parsers.md
└── error-handling.md
```
**理由**:保持项目一致性,降低用户学习成本
---
### 2. 下载器优先级pyppeteer → selenium → httpx → urllib
**决策**:直接采用 `temp/downloader/download.py` 的优先级顺序
- pyppeteer支持 JS 渲染)
- selenium支持 JS 渲染,作为 pyppeteer 的备选)
- httpx轻量级 HTTP 客户端)
- urllib标准库兜底
**备选方案考虑**
- httpx → urllib → pyppeteer → selenium速度优先
- 选择保持原顺序,因为 JS 渲染能力对许多现代网页很重要
---
### 3. 解析器优先级trafilatura → domscribe → MarkItDown → html2text
**决策**:采用精简后的 4 个解析器,顺序参考 `temp/parser/parse.py`
1. trafilatura - 专门用于网页正文提取,质量高
2. domscribe - 专注内容提取
3. MarkItDown - 微软官方,格式规范
4. html2text - 经典库,作为兜底
**备选方案考虑**
- 保留原 6 个解析器(增加 markdownify 和 html-to-markdown
- 选择精简为 4 个,减少维护复杂度
---
### 4. HTML 预处理清理默认开启且不可配置
**决策**:解析前固定执行 HTML 清理,移除 script/style/link/svg 标签和 URL 属性
- 使用 `temp/clean_html.py` 的清理逻辑
- 不提供 `--no-clean` 参数
**理由**:简化设计,减少用户选择负担
---
### 5. Markdown 处理函数独立实现
**决策**:在 `common.py` 中独立实现以下函数,不复用 `lyxy-reader-office`
- `remove_markdown_images()` - 移除图片标记
- `normalize_markdown_whitespace()` - 规范化空行
- `extract_titles()` - 提取标题
- `extract_title_content()` - 提取章节内容
- `search_markdown()` - 正则搜索
**理由**:保持 skill 之间完全隔离
---
### 6. 命令行参数与 lyxy-reader-office 保持一致
**决策**:支持以下参数,与 `lyxy-reader-office` 完全一致:
- (无参数):全文输出
- `-c` / `--count`:字数统计
- `-l` / `--lines`:行数统计
- `-t` / `--titles`:提取标题
- `-tc <name>` / `--title-content <name>`:提取章节
- `-s <pattern>` / `--search <pattern>`:正则搜索
- `-n <num>` / `--context <num>`:搜索上下文行数
**不添加** HTML 专用参数
**理由**:统一用户体验
## Risks / Trade-offs
| 风险 | 影响 | 缓解措施 |
|------|------|----------|
| pyppeteer/selenium 依赖重,安装困难 | 中 | 提供 httpx/urllib 作为轻量备选 |
| trafilatura 可能提取不到正文 | 低 | 后续解析器会继续尝试 |
| 不同解析器输出质量差异大 | 中 | 用户可通过安装不同依赖来间接选择解析器 |
| URL 下载超时或被反爬 | 中 | 多下载器回退增加成功率 |
## Migration Plan
不适用 - 这是新 skill 创建,无迁移需求。
## Open Questions
无 - 所有决策已明确。