fix(zhihu): handle lazy-load images in markdown conversion

知乎使用图片懒加载机制,`<img>` 标签的 `src` 属性包含 SVG 占位符,
真实图片 URL 在 `data-actualsrc` 或 `data-original` 属性中。
`markdownify` 只读取 `src`,导致转换后得到无效占位符。

修复:在转换前预处理 HTML,将真实图片 URL 替换到 `src` 属性。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-15 22:39:43 +08:00
parent aae4d2fd70
commit b6ff7c81aa
2 changed files with 196 additions and 2 deletions
+48 -2
View File
@@ -1,7 +1,14 @@
import re
from bs4 import BeautifulSoup
from markdownify import MarkdownConverter as _MarkdownConverter
class MarkdownConverter:
"""HTML 转 Markdown 转换器,保留完整格式"""
"""HTML 转 Markdown 转换器,保留完整格式
处理知乎等平台的图片懒加载机制:
- 知乎图片的 src 属性可能是 SVG 占位符 (data:image/svg+xml;...)
- 真实图片 URL 存储在 data-actualsrc 或 data-original 属性中
"""
def __init__(self):
self.converter = _MarkdownConverter(
@@ -13,5 +20,44 @@ class MarkdownConverter:
)
def convert(self, html: str) -> str:
"""转换 HTML 为 Markdown"""
"""转换 HTML 为 Markdown
Args:
html: 输入的 HTML 字符串
Returns:
转换后的 Markdown 字符串
"""
# 预处理:处理懒加载图片
html = self._fix_lazy_load_images(html)
return self.converter.convert(html)
def _fix_lazy_load_images(self, html: str) -> str:
"""修复懒加载图片的 src 属性
将 data-actualsrc 或 data-original 属性的值替换到 src 属性中,
以便 markdownify 能够正确提取真实图片 URL。
Args:
html: 输入的 HTML 字符串
Returns:
处理后的 HTML 字符串
"""
soup = BeautifulSoup(html, 'html.parser')
for img in soup.find_all('img'):
src = img.get('src', '')
# 如果 src 不是占位符,保持原样
if not src or not src.startswith('data:'):
continue
# 尝试获取真实图片 URL
# 优先 data-actualsrc,其次 data-original
real_src = img.get('data-actualsrc') or img.get('data-original')
if real_src:
img['src'] = real_src
return str(soup)