1. author 字段清理零宽度空格和换行符,修复 Obsidian 解析 2. 扩展 content_type 条件,answer/zhuanlan 使用文章模板 3. 读取 content.md 时去除 YAML frontmatter 4. generate_frontmatter 正确推断 platform 为 zhihu Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,138 @@
|
||||
---
|
||||
status: awaiting_human_verify
|
||||
trigger: "知乎文章归档输出格式存在多个问题"
|
||||
created: "2026-03-16T17:45:00+08:00"
|
||||
updated: "2026-03-16T18:15:00+08:00"
|
||||
---
|
||||
|
||||
## Current Focus
|
||||
|
||||
hypothesis: 修复完成,等待用户验证
|
||||
test: 用户运行实际工作流验证
|
||||
expecting: 知乎文章归档格式正确
|
||||
next_action: 等待用户确认
|
||||
|
||||
## Symptoms
|
||||
|
||||
expected: |
|
||||
1. 元数据 YAML 格式正确,Obsidian 可以正常解析
|
||||
2. 文章归档模板应与视频不同:只要 300 字摘要 + 原文
|
||||
3. 原文部分不应包含额外的元数据格式
|
||||
4. 原文部分第一句应保持为正文,不应变成标题
|
||||
|
||||
actual: |
|
||||
1. bvid 这一项空了一行导致 Obsidian 读取元数据错误
|
||||
2. 文章归档使用了视频模板,显示了视频时间
|
||||
3. 原文部分多了一段元数据格式
|
||||
4. 原文部分第一句正文变成了标题
|
||||
|
||||
errors: 无显式错误,Obsidian 解析 YAML 元数据失败
|
||||
reproduction: 运行一键 CLI 命令处理知乎文章链接,查看生成的归档 Markdown 文件
|
||||
started: 刚发现,可能是模板或格式化逻辑问题
|
||||
|
||||
## Eliminated
|
||||
|
||||
## Evidence
|
||||
|
||||
- timestamp: "2026-03-16T17:45:00+08:00"
|
||||
checked: zhihu_2003232153480226496_content.md 文件
|
||||
found: |
|
||||
1. frontmatter 中 author 字段后有空行(第4行 author 后有一个空行)
|
||||
2. content.md 使用的是 zhihu.py 中的 _format_with_frontmatter,不是 deep_analyzer
|
||||
3. 该文件是原始抓取的内容,不是最终分析报告
|
||||
implication: 问题可能在两个地方 - zhihu.py 的 _format_with_frontmatter 和 deep_analyzer.py 的 generate_frontmatter
|
||||
|
||||
- timestamp: "2026-03-16T17:47:00+08:00"
|
||||
checked: deep_analyzer.py 的 generate_frontmatter 函数(第436-470行)
|
||||
found: |
|
||||
1. 第455-459行:只有 content_type == "video" 时才添加 bvid
|
||||
2. 这意味着对 answer/zhuanlan 类型不应该添加 bvid
|
||||
3. 但代码中 bvid 只在 video 类型下插入
|
||||
implication: generate_frontmatter 函数本身的逻辑是正确的,问题可能出在调用方或数据源
|
||||
|
||||
- timestamp: "2026-03-16T17:48:00+08:00"
|
||||
checked: zhihu.py 的 _format_with_frontmatter 函数(第237-265行)
|
||||
found: |
|
||||
该函数用于 fetch_content,生成简单的 frontmatter:
|
||||
- title, author, source_url, platform, content_type, fetched_at
|
||||
- 没有 bvid 字段
|
||||
implication: zhihu.py 生成的 content.md 是正确的,问题可能出在最终的分析报告
|
||||
|
||||
- timestamp: "2026-03-16T17:49:00+08:00"
|
||||
checked: 用户报告的问题描述与实际 content.md 对比
|
||||
found: |
|
||||
实际 zhihu_2003232153480226496_content.md 文件中:
|
||||
- author 字段后有换行符(author 的值包含换行)
|
||||
- frontmatter 格式看起来正确,但 author 值 "啦啦啦啦" 后有不可见字符/换行
|
||||
implication: 问题可能是 author 字段的值包含换行符,导致 YAML 解析失败
|
||||
|
||||
- timestamp: "2026-03-16T17:51:00+08:00"
|
||||
checked: metadata.json 中的 author 字段
|
||||
found: author 值为 '啦啦啦啦\u200b\n\u200b',包含零宽度空格(U+200B)和换行符
|
||||
implication: zhihu_extractor 提取的 author 字段包含不可见字符,需要在生成 frontmatter 时清理
|
||||
|
||||
- timestamp: "2026-03-16T17:53:00+08:00"
|
||||
checked: deep_analyzer.py 的 _build_prompt 函数(第193-196行)
|
||||
found: |
|
||||
if content_type == "article":
|
||||
return self._build_article_prompt(...)
|
||||
else:
|
||||
return self._build_video_prompt(...)
|
||||
只检查 "article",不检查 "answer" 或 "zhuanlan"
|
||||
implication: 知乎 answer 类型走视频模板,导致生成了"时间轴"等视频专用内容
|
||||
|
||||
- timestamp: "2026-03-16T17:54:00+08:00"
|
||||
checked: analysis.md 最终分析报告
|
||||
found: |
|
||||
1. 第4-5行 author 后有空行(零宽度空格+换行)
|
||||
2. 第6行 platform: bilibili(应该是 zhihu)
|
||||
3. 第41-67行有"时间轴"部分(视频模板,文章不需要)
|
||||
4. 第69-212行"原文"部分追加了完整的 content.md(包含 frontmatter)
|
||||
implication: 多个问题需要修复
|
||||
|
||||
- timestamp: "2026-03-16T17:55:00+08:00"
|
||||
checked: analyze.py 的 _write_analysis_report 函数(第283-285行)
|
||||
found: |
|
||||
if content_type in ("article", "answer", "zhuanlan") and result.original_text:
|
||||
full_analysis = full_analysis.rstrip() + "\n\n## 原文\n\n" + result.original_text
|
||||
result.original_text 是从 content 的 text 字段提取的,应该只是正文
|
||||
implication: 问题在 deep_analyzer.py 的 analyze 函数中,original_text 设置为完整的 text,但 text 来自 content.md 的全文
|
||||
|
||||
## Resolution
|
||||
|
||||
root_cause: |
|
||||
问题1: author 字段包含零宽度空格(U+200B)和换行符
|
||||
- 来源: zhihu_extractor 提取的 author 字段包含不可见字符
|
||||
- 影响: YAML frontmatter 解析失败,Obsidian 无法读取元数据
|
||||
|
||||
问题2: _build_prompt 函数只检查 content_type == "article"
|
||||
- 位置: deep_analyzer.py 第193-196行
|
||||
- 影响: 知乎 answer/zhuanlan 类型走视频模板,生成"时间轴"等不需要的内容
|
||||
|
||||
问题3: 原文部分追加了完整的 content.md(包含 frontmatter)
|
||||
- 位置: analyze.py 第103行读取整个 content.md 文件
|
||||
- 影响: "原文"部分包含 YAML frontmatter,第一行变成标题
|
||||
|
||||
问题4: platform 字段默认为 bilibili
|
||||
- 位置: deep_analyzer.py 第151行和第452行
|
||||
- 影响: 知乎内容的 platform 显示为 bilibili
|
||||
|
||||
fix: |
|
||||
1. deep_analyzer.py:
|
||||
- _build_prompt: 扩展条件为 content_type in ("article", "answer", "zhuanlan")
|
||||
- analyze: 清理 author 字段的零宽度空格和换行符
|
||||
- generate_frontmatter: 清理 author 字段
|
||||
- 根据 URL 或 content_type 推断 platform
|
||||
|
||||
2. analyze.py:
|
||||
- 读取 content.md 时,去除 frontmatter 部分,只保留正文
|
||||
|
||||
verification: |
|
||||
- 单元测试: 15/15 通过
|
||||
- _clean_string 函数测试: 成功清理零宽度空格和换行符
|
||||
- generate_frontmatter 测试: 正确推断 platform 为 zhihu
|
||||
- _strip_frontmatter 测试: 成功去除 YAML frontmatter
|
||||
|
||||
files_changed:
|
||||
- kb-deep-analyzer/deep_analyzer.py
|
||||
- kb_pipeline/processors/analyze.py
|
||||
@@ -1,81 +0,0 @@
|
||||
---
|
||||
status: awaiting_human_verify
|
||||
trigger: "知乎文章处理时图片链接丢失"
|
||||
created: 2026-03-15T00:00:00Z
|
||||
updated: 2026-03-16T00:00:02Z
|
||||
---
|
||||
|
||||
## Current Focus
|
||||
|
||||
hypothesis: 图片重复是因为知乎 HTML 包含 <noscript> 标签 - 已确认并修复
|
||||
test: 已添加 test_noscript_images_not_duplicated 测试
|
||||
expecting: 用户验证实际知乎链接处理
|
||||
next_action: 等待用户验证
|
||||
|
||||
## Resolution
|
||||
|
||||
root_cause: |
|
||||
问题1 (已修复): 知乎使用图片懒加载机制,`<img>` 标签的 `src` 属性包含 SVG 占位符(`data:image/svg+xml;...`),真实图片 URL 存储在 `data-actualsrc` 属性中。
|
||||
|
||||
问题2 (本次修复): 知乎 HTML 结构包含 `<noscript>` 标签作为备用,里面有相同的真实图片 URL。修复懒加载后,外层 img 和 noscript 内的 img 都有真实 URL,导致图片重复出现两次。
|
||||
|
||||
fix: |
|
||||
修改 `markdown_converter.py` 的 `_fix_lazy_load_images` 方法:
|
||||
1. 在处理 img 标签之前,先移除所有 `<noscript>` 标签
|
||||
2. 这样只保留懒加载的主图片,避免重复
|
||||
|
||||
verification: 单元测试全部通过(13/13),包括新的 noscript 重复测试
|
||||
files_changed: [kb-zhihu-metadata/markdown_converter.py, tests/test_zhihu_metadata/test_markdown_converter.py]
|
||||
|
||||
## Symptoms
|
||||
|
||||
expected: 当分析知乎文章时,原文部分的图片链接应该保留在 markdown 中,用户可以在 markdown 中看到图片链接
|
||||
actual: 文字内容正确,图片无法看到,最后归档的分析内容中完全没有图片或者图片链接
|
||||
errors: 无显式错误,命令执行成功但图片丢失
|
||||
reproduction: 运行一键 CLI 命令处理知乎链接:https://www.zhihu.com/question/1936375725931361485/answer/2003232153480226496
|
||||
started: 第一次出现,可能是功能从未正确实现
|
||||
|
||||
## Eliminated
|
||||
|
||||
<!-- APPEND only -->
|
||||
|
||||
## Evidence
|
||||
|
||||
- timestamp: 2026-03-15T00:00:00Z
|
||||
checked: markdown_converter.py 的图片转换
|
||||
found: markdownify 正确转换 `<img>` 标签为 Markdown 格式 ``
|
||||
implication: Markdown 转换器工作正常,问题不在转换层
|
||||
|
||||
- timestamp: 2026-03-15T00:00:00Z
|
||||
checked: zhihu_extractor.py 的 _extract_answer_content 方法
|
||||
found: 使用 `.RichText` 选择器获取 HTML,然后调用 markdown_converter.convert()
|
||||
implication: 提取逻辑看起来正确,需要验证选择器是否正确获取到包含图片的 HTML
|
||||
|
||||
- timestamp: 2026-03-15T00:00:00Z
|
||||
checked: zhihu_article_crawler.py(MediaCrawler 版本)
|
||||
found: 第139行使用 `content_text` 字段,这是纯文本,不包含 HTML
|
||||
implication: 这是另一个路径(MediaCrawler),但 kb_pipeline 使用的是 ZhihuPlaywrightExtractor
|
||||
|
||||
- timestamp: 2026-03-15T00:01:00Z
|
||||
checked: 知乎懒加载图片机制
|
||||
found: 知乎图片的 src 属性是 SVG 占位符(data:image/svg+xml;...),真实 URL 在 data-actualsrc 或 data-original 属性中
|
||||
implication: markdownify 只读取 src 属性,得到无效占位符而非真实图片链接
|
||||
|
||||
- timestamp: 2026-03-15T00:01:00Z
|
||||
checked: 模拟知乎懒加载 HTML 转换测试
|
||||
found: 确认转换结果包含 `data:image/svg+xml` 占位符而不是真实图片 URL
|
||||
implication: ROOT CAUSE CONFIRMED - 需要预处理 HTML 提取真实图片 URL
|
||||
|
||||
- timestamp: 2026-03-16T00:00:00Z
|
||||
checked: 知乎 HTML 结构中的 noscript 标签
|
||||
found: 知乎图片 HTML 结构为 `<figure><img data-actualsrc=...><noscript><img src=...></noscript></figure>`,noscript 内包含备用图片
|
||||
implication: ROOT CAUSE CONFIRMED (问题2) - 修复懒加载后,两个 img 都有真实 URL,导致重复
|
||||
|
||||
## Resolution (问题2: 原文丢失)
|
||||
|
||||
root_cause: 知乎回答 (answer) 和专栏 (zhuanlan) 的原文没有被追加到分析报告中。代码只在 `content_type == "article"` 时设置和追加原文,但知乎回答的类型是 `"answer"`
|
||||
fix:
|
||||
- `deep_analyzer.py:184` - 扩展条件为 `content_type in ("article", "answer", "zhuanlan")`
|
||||
- `analyze.py:244` - 扩展条件为 `content_type in ("article", "answer", "zhuanlan")`
|
||||
verification: 待用户测试
|
||||
files_changed: [kb-deep-analyzer/deep_analyzer.py, kb_pipeline/processors/analyze.py]
|
||||
Reference in New Issue
Block a user