如何从HHC文件提取CHM文档的目录(TOC)相关信息?
从CHM的HHC文件提取目录信息的方法
HHC是CHM文件的目录定义文件,基于HTML结构,你看到的<UL>是目录层级容器,<LI>对应单个目录条目,<OBJECT>里的参数分别对应:Name是标题、Local是文件路径、Merge则是引用的其他HHC子目录文件。要提取Heading-Section(层级)、Topic-Name、Topic-File-Path,有几种可行的方法:
一、用CHM专用工具提取(简单高效)
- 7-Zip + CHM Explorer组合:
- 把CHM文件当成压缩包,用7-Zip解压到本地文件夹,就能获取所有关联的HHC、HTM文件。
- 打开CHM Explorer,加载解压后的主HHC文件,工具会自动识别并解析
Merge引用的子HHC文件。 - 选择导出目录为CSV或纯文本格式,就能直接得到包含层级、标题、文件路径的完整目录数据。
二、写Python脚本批量解析(适合大量文件)
利用HTML解析库递归处理所有HHC文件,自动合并关联内容,示例代码如下:
from bs4 import BeautifulSoup import os import csv def parse_hhc(hhc_path, parent_section=""): results = [] # 读取HHC文件 with open(hhc_path, 'r', encoding='utf-8') as f: soup = BeautifulSoup(f, 'html.parser') for obj in soup.find_all('object', type='text/sitemap'): name_param = obj.find('param', {'name': 'Name'}) local_param = obj.find('param', {'name': 'Local'}) merge_param = obj.find('param', {'name': 'Merge'}) if name_param and local_param: # 提取普通主题条目 topic_name = name_param['value'] topic_path = local_param['value'] # 拼接层级路径 section = f"{parent_section} > {topic_name}" if parent_section else topic_name results.append({ 'Heading-Section': section, 'Topic-Name': topic_name, 'Topic-File-Path': topic_path }) elif merge_param: # 递归解析合并的子HHC文件 merge_info = merge_param['value'] # 从Merge参数中提取子HHC文件名(格式:xxx.chm::/xxx.hhc) sub_hhc_name = merge_info.split('::/')[-1] sub_hhc_path = os.path.join(os.path.dirname(hhc_path), sub_hhc_name) if os.path.exists(sub_hhc_path): results.extend(parse_hhc(sub_hhc_path, parent_section)) return results # 执行解析并导出CSV if __name__ == "__main__": main_hhc_path = "替换成你的主HHC文件路径" toc_data = parse_hhc(main_hhc_path) with open('chm_toc.csv', 'w', newline='', encoding='utf-8') as csv_file: writer = csv.DictWriter(csv_file, fieldnames=['Heading-Section', 'Topic-Name', 'Topic-File-Path']) writer.writeheader() writer.writerows(toc_data)
使用时把main_hhc_path替换成你的主HHC文件路径,运行后会生成chm_toc.csv,里面就是整理好的目录数据。
三、手动解析(适合小体量HHC文件)
用VS Code、Notepad++这类支持代码折叠的文本编辑器打开主HHC文件,按照<UL>/<LI>的层级梳理目录结构:
- 遇到
Name和Local参数,直接提取标题和路径,按层级记录成表格。 - 遇到
Merge参数,找到对应的子HHC文件,重复上述步骤,把内容合并到主目录里即可。
内容的提问来源于stack exchange,提问作者user5005768-hd
相关产品推荐
相关产品推荐

