Python docx转html:如何使用Mammoth将DOCX转换为HTML?

2021年8月13日01:46:04 发表评论 2,483 次浏览

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 文件的样式,你有两个选择:

  1. 你可以使用 MS Word 打开你的 docx 文件并检查样式工具栏。
  2. 你可以通过使用存档管理器打开 DOCX 文件来深入了解 XML 文件,然后导航到/word/styles.xml并找到你的样式。

第二个选项可供那些无法访问 MS Word 或可以解释和显示样式的替代文字处理器的人使用。

Mammoth 已经默认涵盖了一些最常见的样式映射。例如,Heading1docx 样式映射到<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类添加到uHTML 元素,稍微减小字体大小并将文本转换为大写。

在第三行中,我们选择所有具有样式名称的段落,Heading 1并将它们转换为h1具有 Bootstrap 类的 HTML 元素,该类card设置多个样式属性,例如元素的背景颜色、位置和边框。

在最后一行中,我们将 docx 文件中的所有表格转换为tableHTML 元素,使用 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的示例以及教程的完整代码。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: