import xml.etree.ElementTree as ET
def parse_epub_toc(toc_file):
"""解析 EPUB 的 toc.ncx 文件"""
try:
tree = ET.parse(toc_file)
root = tree.getroot()
# 定义命名空间
ns = {'ncx': 'http://www.daisy.org/z3986/2005/ncx/'}
# 获取书籍标题
doc_title = root.find('.//ncx:docTitle/ncx:text', ns)
book_title = doc_title.text if doc_title is not None else "未知标题"
# 获取所有 navPoint 元素
#nav_points = root.findall('.//ncx:navPoint', ns)
nav_points = root.findall('./ncx:navMap/ncx:navPoint', ns)
print(len(nav_points))
return book_title, nav_points, ns
except Exception as e:
print(f"解析文件出错: {e}")
return None, None, None
def build_toc_tree(nav_points, ns):
"""构建目录树结构"""
toc = []
for nav_point in nav_points:
# 获取章节信息
nav_label = nav_point.find('ncx:navLabel/ncx:text', ns)
content = nav_point.find('ncx:content', ns)
if nav_label is not None and content is not None:
chapter = {
'id': nav_point.get('id', ''),
'play_order': nav_point.get('playOrder', ''),
'title': nav_label.text,
'src': content.get('src', ''),
'children': []
}
# 递归处理子章节
sub_nav_points = nav_point.findall('ncx:navPoint', ns)
if sub_nav_points:
sub=True
chapter['children'] = build_toc_tree(sub_nav_points, ns)
toc.append(chapter)
return toc
def print_tree(toc, prefix='', is_last=True):
"""打印树形目录结构"""
for i, chapter in enumerate(toc):
# 当前节点连接符
#connector = '└── ' if (i == len(toc) - 1 and is_last) else '├── '
connector = ' ' if (i == len(toc) - 1 and is_last) else ' '
# 打印当前节点
print(prefix + connector + chapter['title'])
# 准备子节点前缀
# new_prefix = prefix + (' ' if (i == len(toc) - 1 and is_last) else '│ ')
new_prefix = prefix + (' ' if (i == len(toc) - 1 and is_last) else ' ')
# 递归打印子节点
if chapter['children']:
print_tree(chapter['children'], new_prefix , is_last and i == len(toc) - 2)
#print(is_last,i,len(toc) - 1)
def main():
# 输入文件路径
toc_file = 'toc.ncx'
# 解析文件
book_title, nav_points, ns = parse_epub_toc(toc_file)
if not book_title:
return
print(f"书籍标题: {book_title}\n")
print("目录结构:")
# 构建目录树
toc_tree = build_toc_tree(nav_points, ns)
# 打印树形结构
print_tree(toc_tree)
if __name__ == "__main__":
main()