64 lines
1.9 KiB
Python
64 lines
1.9 KiB
Python
import re
|
|
from bs4 import BeautifulSoup
|
|
from markdownify import MarkdownConverter as _MarkdownConverter
|
|
|
|
class MarkdownConverter:
|
|
"""HTML 转 Markdown 转换器,保留完整格式
|
|
|
|
处理知乎等平台的图片懒加载机制:
|
|
- 知乎图片的 src 属性可能是 SVG 占位符 (data:image/svg+xml;...)
|
|
- 真实图片 URL 存储在 data-actualsrc 或 data-original 属性中
|
|
"""
|
|
|
|
def __init__(self):
|
|
self.converter = _MarkdownConverter(
|
|
heading_style="ATX",
|
|
bullets="*,-",
|
|
code_blocks=True,
|
|
tables=True,
|
|
strip=["script", "style", "nav", "footer", "aside"]
|
|
)
|
|
|
|
def convert(self, html: str) -> str:
|
|
"""转换 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)
|