a4a7454cd0
- Move zhihu_extractor.py, zhihu_metadata.py, zhihu_article_crawler.py, markdown_converter.py - Update metadata/__init__.py to export ZhihuPlaywrightExtractor Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
71 lines
2.2 KiB
Python
71 lines
2.2 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。
|
|
|
|
同时移除 <noscript> 标签,因为知乎等平台在 noscript 中包含备用图片,
|
|
会导致修复后图片重复出现。
|
|
|
|
Args:
|
|
html: 输入的 HTML 字符串
|
|
|
|
Returns:
|
|
处理后的 HTML 字符串
|
|
"""
|
|
soup = BeautifulSoup(html, 'html.parser')
|
|
|
|
# 先移除 noscript 标签,避免图片重复
|
|
for noscript in soup.find_all('noscript'):
|
|
noscript.decompose()
|
|
|
|
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)
|