419 字
1 分钟
Halo2 博客 HTML文章 批量转 Astro Markdown 文章Python脚本分享
Halo2 博客 HTML文章 批量转 Astro Markdown 文章Python脚本分享
Waiting for api.github.com...
如果你正准备从 Halo2 迁移到 Astro 框架(例如Fuwari博客),或者手中有一堆 HTML 格式的文章需要处理,手动转换 MarkDown并添加Frontmatter 简直是噩梦。
我用 Gemini 编写并优化了一个 Python 通用转换脚本。它能自动提取标题、生成描述、配置 Astro 标准的 Frontmatter 字段,并完成 HTML 到 Markdown 的转换。
✨ 脚本核心功能
- 智能标题识别:优先提取 HTML 内部的
<h1>或<h2>标签,若无则自动 fallback 到文件名。 - Frontmatter 自动生成:自动填充
title,published,description,tags,category等 Astro 常用字段。 - 描述自动截取:自动抓取正文第一个段落的前 50 个字作为文章摘要(description)。
- 正文清理:转换时自动移除原有的 HTML 标题标签,避免 Markdown 中出现双重标题。
- 灵活配置:通过顶部
CONFIG字典一键修改全局参数。
🛠️ 环境准备
你需要安装以下 Python 库:
Bash
pip install beautifulsoup4 html2text🐍 完整脚本代码
Python
import osimport datetimefrom bs4 import BeautifulSoupimport html2text
# --- 配置区 (根据你的 Astro 需求调整) ---CONFIG = { "input_dir": "./html_files", # 存放 Halo 导出的 HTML 文件 "output_dir": "./posts", # 转换后的 MD 文件存放处 "default_category": "General", # 默认分类 "default_tags": ["Blog", "Imported"], # 默认标签 "image_path": "./cover.webp", # 默认封面路径 "author": "LWR" # 作者名}
def setup_markdown_converter(): h2t = html2text.HTML2Text() h2t.body_width = 0 # 禁用自动换行,保持段落完整 h2t.ignore_links = False return h2t
def convert_html_to_astro_md(): if not os.path.exists(CONFIG["output_dir"]): os.makedirs(CONFIG["output_dir"])
h2t = setup_markdown_converter() # 默认发布日期设为当前日期,你也可以手动修改 today = datetime.datetime.now().strftime('%Y-%m-%d')
print(f"🚀 开始转换任务...")
for filename in os.listdir(CONFIG["input_dir"]): if filename.endswith(".html"): file_path = os.path.join(CONFIG["input_dir"], filename)
with open(file_path, 'r', encoding='utf-8') as f: soup = BeautifulSoup(f.read(), 'html.parser')
# 1. 提取标题 title_tag = soup.find(['h1', 'h2']) title = title_tag.get_text().strip() if title_tag else filename.replace('.html', '')
# 2. 提取描述 (取第一个段落前 50 字) first_p = soup.find('p') description = first_p.get_text().strip()[:50].replace('"', "'") + "..." if first_p else "暂无描述"
# 3. 转换前清理:移除已提取的标题,避免正文重复 if title_tag: title_tag.decompose()
# 4. 转换正文为 Markdown markdown_body = h2t.handle(str(soup))
# 5. 组装 Astro 标准 Frontmatter frontmatter = ( f"---\n" f"title: \"{title}\"\n" f"published: {today}\n" f"description: \"{description}\"\n" f"image: \"{CONFIG['image_path']}\"\n" f"tags: {CONFIG['default_tags']}\n" f"category: \"{CONFIG['default_category']}\"\n" f"author: \"{CONFIG['author']}\"\n" f"draft: false\n" f"---\n\n" f"# {title}\n\n" f"{markdown_body}" )
new_filename = os.path.splitext(filename)[0] + '.md' with open(os.path.join(CONFIG["output_dir"], new_filename), 'w', encoding='utf-8') as f_out: f_out.write(frontmatter)
print(f"✅ 转换成功: {new_filename}")
print(f"🎉 所有任务已完成!请检查 {CONFIG['output_dir']} 文件夹。")
if __name__ == "__main__": convert_html_to_astro_md()📝使用建议
- 文件存放:在脚本同级目录下新建
html_files文件夹,把.html文件丢进去即可。- 图片处理:HTML 中的图片链接会保留。如果你的图片是本地路径,转换后可能需要手动批量替换 Markdown 中的图片前缀,或将图片移动到 Astro 的
public目录下。- 日期提取:目前的日期默认为“当前时间”。可以通过修改如下字段`
# 默认发布日期设为当前日期,你也可以手动修改# today = datetime.datetime.now().strftime('%Y-%m-%d') 修改前today = "2026-01-01" #修改后
Halo2 博客 HTML文章 批量转 Astro Markdown 文章Python脚本分享
https://www.kyresn114.top/posts/technology/sharing-of-python-scripts-for-batch-conversion-of-halo2-blog-html-articles-to-astro-blog-markdown/ 部分信息可能已经过时



