mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3
419 字
1 分钟
Halo2 博客 HTML文章 批量转 Astro Markdown 文章Python脚本分享
2026-02-02
统计加载中...

Halo2 博客 HTML文章 批量转 Astro Markdown 文章Python脚本分享#

Kyresn
/
Python-script-to-batch-convert-Halo2-blog-HTML-articles-into-Astro-Markdown-articles
Waiting for api.github.com...
00K
0K
0K
Waiting...

如果你正准备从 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

Terminal window
pip install beautifulsoup4 html2text

🐍 完整脚本代码#

Python

import os
import datetime
from bs4 import BeautifulSoup
import 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()

📝使用建议
  1. 文件存放:在脚本同级目录下新建 html_files 文件夹,把 .html 文件丢进去即可。
  2. 图片处理:HTML 中的图片链接会保留。如果你的图片是本地路径,转换后可能需要手动批量替换 Markdown 中的图片前缀,或将图片移动到 Astro 的 public 目录下。
  3. 日期提取:目前的日期默认为“当前时间”。可以通过修改如下字段`
# 默认发布日期设为当前日期,你也可以手动修改
# 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/
作者
Kyresn114
发布于
2026-02-02
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00