合并Jupyter Lab多份Sheet导出的HTML并保留LaTex渲染方法
解决Jupyter Lab多Sheet合并导出为单HTML的方法
这里的"Sheet"默认指多个独立的.ipynb笔记本文件,以下两种方法可实现合并导出并保持单个导出时的格式:
方法一:先合并笔记本再导出HTML
这种方式先将多个笔记本合并为单个.ipynb文件,再导出为HTML,格式与单笔记本导出完全一致:
- 安装
nbmerge工具:pip install nbmerge - 合并指定的笔记本文件:
nbmerge notebook1.ipynb notebook2.ipynb notebook3.ipynb > merged_notebook.ipynb - 将合并后的笔记本导出为HTML:
生成的jupyter nbconvert --to html merged_notebook.ipynbmerged_notebook.html就是包含所有内容的单文件,样式与单独导出完全一致,且文本可直接复制。
方法二:先转HTML片段再合并
适合需要灵活调整各笔记本内容分隔方式的场景:
- 将每个笔记本转为无完整HTML结构的内容片段:
此时生成的jupyter nbconvert --to html --template basic notebook1.ipynb jupyter nbconvert --to html --template basic notebook2.ipynbnotebook1.html、notebook2.html仅包含页面内容部分,无重复的<head>和样式定义。 - 用Python脚本拼接为完整HTML:
复制以下代码保存为merge_html.py,修改html_files列表为你的片段文件名,运行即可生成最终HTML:import os # 待合并的HTML片段文件列表 html_files = ["notebook1.html", "notebook2.html"] output_file = "merged_result.html" # 从单笔记本导出的完整HTML中复制<head>部分,确保样式一致 head_content = """ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Merged Notebooks</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/highlight.js@9.12.0/styles/github.min.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/notebook@5.7.8/style/style.min.css"> <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/highlight.js@9.12.0/lib/highlight.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/highlight.js@9.12.0/lib/languages/python.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/notebook@5.7.8/static/components/requirejs/require.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/notebook@5.7.8/static/notebook/js/main.min.js"></script> <script> $(document).ready(function() { $('div.highlight pre').each(function(i, block) { hljs.highlightBlock(block); }); }); </script> </head> <body> """ # 读取所有片段内容,添加分割线区分不同笔记本 body_content = "" for file in html_files: with open(file, 'r', encoding='utf-8') as f: body_content += f.read() + "\n<hr class='divider'>\n" # 拼接结尾部分 end_content = """ </body> </html> """ # 写入最终文件 with open(output_file, 'w', encoding='utf-8') as f: f.write(head_content + body_content + end_content) print(f"合并完成,输出文件:{output_file}") - 运行脚本:
python merge_html.py
注意事项
- 若你说的"Sheet"是指同一个笔记本内的工作表(如
ipysheet插件的表格工作表),需先将每个工作表内容单独保存为独立笔记本,再按上述方法合并。 - 生成的HTML文件可直接用浏览器打开,无需依赖Jupyter环境,文本可自由复制。
内容的提问来源于stack exchange,提问作者remusconnor
相关产品推荐
相关产品推荐

