Python docx转html介绍
在你的软件开发路径中的某个时刻,你必须将文件从一种格式转换为另一种格式,例如Python word文档转html。
DOCX(由 Microsoft Word 使用)是一种非常常见的文件格式,供很多人使用。有时,我们想将Word文档转换为 HTML,也就是实现Python docx转html,下面我们会看到Python word转html的详细实现和原理介绍。
Python docx转html可以通过Mammoth包轻松实现:这是一个简单、高效、快速的库,用于将 DOCX 文件转换为 HTML。在本文中,我们将学习如何在 Python 中使用 Mammoth 将 DOCX 转换为 HTML,文章结尾有Python将DOCX转换为HTML的完整代码。
Python docx转html:安装Mammoth
作为一个好习惯,请记住在安装之前准备好并激活你的虚拟环境:
$ python3 -m venv myenv
$ . myenv/bin/activate
然后让我们安装Mammoth pip
:
$ pip3 install mammoth
本Python docx文件转为html教程使用 Mammoth 版本1.4.15
实现Python word转html。这是你可以在本教程中使用的示例文档。如果你有要转换的文档,请确保它是一个.docx
文件!
现在你已准备就绪,让我们开始提取文本并将其编写为 HTML。
提取 DOCX 文件的原始文本
在Python docx转html时保留格式是 Mammoth 的最佳功能之一。但是,如果你只需要 DOCX 文件的文本,你会惊喜地发现只需要几行代码。
你可以使用该extract_raw_text()
方法来检索它:
import mammoth
with open(input_filename, "rb") as docx_file:
result = mammoth.extract_raw_text(docx_file)
text = result.value # The raw text
with open('output.txt', 'w') as text_file:
text_file.write(text)
请注意,此方法不会返回有效的 HTML 文档。它只返回页面上的文本,因此我们将其与.txt
扩展名一起保存。如果确实需要保留布局和/或格式,则需要提取 HTML 内容。
Python docx转html:使用自定义样式映射
默认情况下,Mammoth会将你的文档转换为 HTML,但它不会为你提供有效的 HTML 页面。虽然 Web 浏览器可以显示内容,但缺少<html>
用于封装文档的<body>
标签和用于包含文档的标签。你选择如何集成其输出取决于你。假设你正在使用具有模板的 Web 框架。你可能会定义一个模板来显示 Word 文档并将 Mammoth 的输出加载到模板正文中。
Python将DOCX转换为HTML:Mammoth 不仅可以灵活地使用其输出,还可以灵活地创建它。特别是,当我们想要为我们生成的 HTML 设置样式时,我们有很多选择。我们通过将每个 DOCX 格式规则与等效的(或尽可能接近的)CSS 规则进行匹配来映射样式。
若要实现Python word转html,要查看你的 DOCX 文件的样式,你有两个选择:
- 你可以使用 MS Word 打开你的 docx 文件并检查样式工具栏。
- 你可以通过使用存档管理器打开 DOCX 文件来深入了解 XML 文件,然后导航到
/word/styles.xml
并找到你的样式。
第二个选项可供那些无法访问 MS Word 或可以解释和显示样式的替代文字处理器的人使用。
Mammoth 已经默认涵盖了一些最常见的样式映射。例如,Heading1
docx 样式映射到<h1>
HTML 元素,粗体映射到<strong>
HTML 元素等。
我们还可以使用 Mammoth 来自定义文档的样式,同时映射它们。例如,如果你想将 DOCX 文件中所有粗体出现在HTML 中更改为斜体,实现Python docx转html你可以这样做:
import mammoth
custom_styles = "b => i"
with open(input_filename, "rb") as docx_file:
result = mammoth.convert_to_html(docx_file, style_map = custom_styles)
text = result.value
with open('output.html', 'w') as html_file:
html_file.write(text)
加上custom_styles
变量,左边的样式来自于DOCX文件,右边的则是对应的CSS。
Python docx文件转为html - 假设我们想完全省略粗体,我们可以将映射目标留空:
custom_styles = "b => "
有时,我们移植的文档有很多样式要保留。为我们想要映射的每种样式创建一个变量很快就变得不切实际。幸运的是,我们可以docstrings
一次性映射任意数量的样式:
custom_styles = """ b => del
u => em
p[style-name='Heading 1'] => i"""
你可能已经注意到最后一个映射与其他映射略有不同。在Python将DOCX转换为HTML映射样式时,我们可以使用[]
带有条件的方括号,以便只有元素的子集以这种方式设置样式。
在我们的示例中,p[style-name='Heading 1']
选择具有样式名称的段落Heading 1
。我们还可以使用p[style-name^='Heading']
选择具有以 开头的样式名称的每个段落Heading
。
Python word转html样式映射还允许我们将样式映射到自定义 CSS 类。通过这样做,我们可以随心所欲地塑造 HTML 的样式。让我们举一个例子,在这样的文档字符串中定义我们的基本自定义 CSS:
custom_css ="""
<style>
.red{
color: red;
}
.underline{
text-decoration: underline;
}
.ul.li{
list-style-type: circle;
}
table, th, td {
border: 1px solid black;
}
</style>
"""
现在我们可以更新我们的映射以引用我们在<style>
块中定义的 CSS 类:
custom_styles = """ b => b.red
u => em.red
p[style-name='Heading 1'] => h1.red.underline"""
现在我们需要做的就是将 CSS 和 HTML 合并在一起:
edited_html = custom_css + html
如果你的 DOCX 文件包含任何这些元素,你将能够看到Python docx文件转为html的结果。
Python docx转html:现在我们知道了如何映射样式,让我们使用一个更知名的 CSS 框架(连同 JS)来让我们的 HTML 看起来更好,并练习更可能的现实生活场景。
使用 Bootstrap(或任何其他 UI 框架)映射样式
就像我们对 所做的一样custom_css
,我们需要确保 CSS 加载了 HTML。我们需要将 Bootstrap 文件 URI 或 CDN 添加到我们的 HTML 中,Python word文档转html样式示例:
bootstrap_css = '<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">'
bootstrap_js = '<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous"></script>'
我们还将稍微调整我们的custom_styles
以匹配我们的新 CSS 类:
custom_styles = """ b => b.mark
u => u.initialism
p[style-name='Heading 1'] => h1.card
table => table.table.table-hover
"""
Python docx转html样式映射:
在第一行中,我们将粗体 DOCX 样式映射到b
带有 class的HTML 元素,该 classmark
是等效于 HTML<mark>
标记的 Bootstrap 类,用于突出显示部分文本。
在第二行中,我们将initialism
类添加到u
HTML 元素,稍微减小字体大小并将文本转换为大写。
在第三行中,我们选择所有具有样式名称的段落,Heading 1
并将它们转换为h1
具有 Bootstrap 类的 HTML 元素,该类card
设置多个样式属性,例如元素的背景颜色、位置和边框。
在最后一行中,我们将 docx 文件中的所有表格转换为table
HTML 元素,使用 Bootstrap 的table
类赋予它新的外观,并且通过添加table-hover
.
Python将DOCX转换为HTML:像以前一样,我们使用点符号将多个类映射到同一个 HTML 元素,即使样式来自另一个来源。
最后,将 Bootstrap CDN 添加到我们的 HTML 中:
edited_html = bootstrap_css + html + bootstrap_js
我们的 HTML 现在可以共享了,外观和感觉都很好!这是完整的Python docx转html代码供参考:
import mammoth
input_filename = "file-sample_100kB.docx"
custom_styles = """ b => b.mark
u => u.initialism
p[style-name='Heading 1'] => h1.card
table => table.table.table-hover
"""
bootstrap_css = '<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">'
bootstrap_js = '<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous"></script>'
with open(input_filename, "rb") as docx_file:
result = mammoth.convert_to_html(docx_file, style_map = custom_styles)
html = result.value
edited_html = bootstrap_css + html + bootstrap_js
output_filename = "output.html"
with open(output_filename, "w") as f:
f.writelines(edited_html)
Python word转html样式输出:另外,这里要注意的另一点是,在现实生活中,你可能不会像我们在这里所做的那样将 Bootstrap CSS 直接添加到 HTML 内容中。相反,你可以将 HTML 内容加载/注入到预打包的 HTML 页面,该页面已经具有必要的 CSS 和 JS 包。
到目前为止,你已经看到我们在设置输出样式时有多大的灵活性。Mammoth 还允许我们修改我们正在转换的内容。现在让我们来看看。
Python docx转html:处理我们不想共享的图像
Python将DOCX转换为HTML:假设我们希望在转换时忽略 DOCX 文件中的图像。在convert_to_html()
接受一个convert_image
参数,它是图像处理函数。它返回一个图像列表,这些图像应该被转换并添加到 HTML 文档中。
自然地,如果我们覆盖它并返回一个空列表,它们将从转换后的页面中省略:
def ignore_image(image):
return []
现在,让我们将该函数作为参数传递给convert_to_html()
方法:
with open(input_filename, "rb") as docx_file:
result = mammoth.convert_to_html(docx_file, style_map = custom_styles, convert_image=ignore_image)
html = result.value
with open('output.html', 'w') as html_file:
html_file.write(text)
Python word转html:Mammoth 在生成 HTML 文件时会忽略所有图像。
到目前为止,我们一直在以编程方式将 Mammoth 与 Python 结合使用。Mammoth 也是一个 CLI 工具,因此我们有另一个界面来执行 DOCX 到 HTML 对话。让我们在下一节中看看它是如何工作的。
Python docx转html:使用命令行工具将 DOCX 转换为 HTML
使用 CLI 使用 Mammoth 进行文件转换,通常如下所示:
$ mammoth path/to/input_filename.docx path/to/output.html
如果要将图像与 HTML 分开,可以指定一个输出文件夹:
$ mammoth file-sample_100kB.docx --output-dir=imgs
Python word文档转html:我们还可以像在 Python 中一样添加自定义样式。你需要先创建一个自定义样式文件:
$ touch my-custom-styles
然后我们将在其中添加我们的自定义样式,语法与之前相同:
b => b.red
u => em.red
p[style-name='Heading 1'] => h1.red.underline
现在我们可以生成自定义样式的 HTML 文件:
$ mammoth file-sample_100kB.docx output.html --style-map=my-custom-styles
你完成Python word转html了!你的文档将使用定义的自定义样式进行转换。
Python docx转html结论
在使用 Web 技术时,文件类型转换是一种常见情况,Python word文档转html是其中一个常见的问题。Python将DOCX转换为HTML的技术允许我们根据需要重建数据。Python word转html:通过 Mammoth,我们学习了如何从 docx 中提取文本以及如何将其转换为 HTML。
实现Python docx转html时,我们可以使用我们创建的 CSS 规则或常见 UI 框架附带的规则来设置输出样式。我们也可以省略我们不希望在 HTML 中可用的数据。最后,我们看到了如何使用 Mammoth CLI 作为文件转换的替代选项。
如何实现Python docx文件转为html?你可以在此 GitHub 存储库上找到Python docx转html的示例以及教程的完整代码。