Python使用Mammoth將DOCX轉(zhuǎn)換為HTML
我們在實(shí)際的項(xiàng)目開發(fā)的過程中,有時(shí)候不得不將文件從一種格式轉(zhuǎn)換為另一種格式。
DOCX(由 Microsoft Word 使用)是一種非常常見的文件格式,被很多人使用。有時(shí)候,我們希望將 Word 文檔轉(zhuǎn)換為 HTML。
這可以通過 Mammoth 包輕松實(shí)現(xiàn)。它是一個(gè)用于將 DOCX 文件轉(zhuǎn)換為 HTML 的簡單、高效、快速的庫。在本文中,我們將學(xué)習(xí)如何在 Python 中使用 Mammoth 將 DOCX 轉(zhuǎn)換為 HTML。
安裝 Mammoth
首先,在安裝之前準(zhǔn)備好并激活你的虛擬環(huán)境:
python3 -m venv myenv . myenv/bin/activate
然后,使用pip安裝 Mammoth:
pip3 install mammoth
本教程使用的 Mammoth 版本是 1.4.15。在測試的時(shí)候,請確保它是.docx 文件!
以上環(huán)境準(zhǔn)備好后,現(xiàn)在讓我們開始提取文本并將其轉(zhuǎn)換成 HTML。
提取 DOCX 文件的原始文本
在轉(zhuǎn)換為 HTML 時(shí)保留格式是 Mammoth 的最佳功能之一。這里我們只需要幾行代碼轉(zhuǎn)換成你需要 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 擴(kuò)展來保存它。如果你確實(shí)需要保持布局或格式,你需要提取 HTML 內(nèi)容。
將 Docx 轉(zhuǎn)換為 HTML 并自定義樣式映射
默認(rèn)情況下,Mammoth 將文檔轉(zhuǎn)換為 HTML,但它不會提供有效的 HTML 頁面。雖然網(wǎng)頁瀏覽器可以顯示內(nèi)容,但它缺少一個(gè)<html>標(biāo)簽來封裝文檔,以及一個(gè)<body>標(biāo)簽來包含文檔。
假設(shè)使用的是帶有模板的網(wǎng)絡(luò)框架。可能會定義一個(gè)模板來顯示 Word 文檔,并將 Mammoth 的輸出加載到模板主體內(nèi)。
Mammoth 不僅在如何使用其輸出方面具有靈活性,而且在如何創(chuàng)建輸出方面也具有很大的靈活性。特別是在我們想要樣式化我們生成的 HTML 時(shí),我們有很多選項(xiàng)。我們通過將每個(gè) DOCX 格式規(guī)則匹配到相應(yīng)的 CSS 規(guī)則來映射樣式。
要查看你的 DOCX 文件有哪些樣式,你有兩個(gè)選擇:
- 使用 MS Word 打開您的 docx 文件,并檢查樣式工具欄。
- 通過用解壓管理器打開你的 DOCX 文件來研究 XML 文件,然后導(dǎo)航到
/word/styles.xml并找到你的樣式。
第二個(gè)選項(xiàng)適用于無法使用 MS Word 或無法解釋和顯示樣式的替代文字處理程序的用戶。
Mammoth 已經(jīng)默認(rèn)涵蓋了某些最常用的樣式映射。例如,Heading1在 docx 樣式中映射到 HTML 元素的<h1>,bold被映射到 HTML 元素的<strong>,等等。
我們還可以在映射時(shí)使用 Mammoth 來自定義文檔的樣式。例如,如果您想將 DOCX 文件中的所有bold出現(xiàn)次數(shù)更改為 HTML 中的斜體,可以這樣子實(shí)現(xiàn):
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 文件,而右邊的是相應(yīng)的 CSS。
假設(shè)我們想完全省略粗體出現(xiàn)的次數(shù),我們可以將映射目標(biāo)留空:
custom_styles = "b => "
有時(shí)我們轉(zhuǎn)換的文檔會有很多樣式需要保留。這個(gè)時(shí)候再這樣實(shí)現(xiàn)就會變得不切實(shí)際,要為每一個(gè)我們要映射的樣式都創(chuàng)建一個(gè)變量。
不過有解法,我們可以使用docstrings一次映射我們想要的任意多個(gè)樣式:
custom_styles = """ b => del
u => em
p[style-name='Heading 1'] => i"""
你可能已經(jīng)注意到,最后的映射與其他的有點(diǎn)不同。在映射樣式時(shí),我們可以使用方括號[]并在其中添加條件,這樣只有部分元素會以這種方式進(jìn)行樣式設(shè)置。
在我們的示例中,p[style-name='Heading 1']選擇具有樣式名稱的段落Heading 1。我們也可以使用p[style-name^='Heading']來選擇具有以Heading開頭的樣式名稱的每個(gè)段落。
樣式映射還允許我們將樣式映射到自定義 CSS 類。通過這樣做,我們可以隨心所欲地修改 HTML 的樣式。讓我們舉一個(gè)例子,我們在文檔字符串中定義基本的自定義 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>
"""
現(xiàn)在我們可以更新我們的映射,以引用我們在<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
這個(gè)時(shí)候如果 DOCX 文件包含任何這些元素,就能看到我們設(shè)置的樣式結(jié)果。
通過以上方法我們已經(jīng)知道如何映射樣式,那就讓我們使用一個(gè)更著名的 CSS 框架(以及相關(guān)的 JS)來讓我們的 HTML 看起來更好,并練習(xí)一個(gè)更有可能的現(xiàn)實(shí)場景。
使用 Bootstrap(或其他任何前端框架)映射樣式
就像我們之前處理custom_css一樣,我們需要確保 CSS 與 HTML 一起加載。我們需要將 Bootstrap 文件 URI 或 CDN 添加到我們的 HTML 中:
bootstrap_css = '<link rel="external nofollow" rel="external nofollow" 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>'
這里我稍微調(diào)整我們的 custom_styles,以匹配我們的新 CSS 類:
custom_styles = """ b => b.mark
u => u.initialism
p[style-name='Heading 1'] => h1.card
table => table.table.table-hover
"""
在第一行,我們將粗體 DOCX 樣式映射到具有類的 HTML 元素,該類是 HTML 標(biāo)簽的 Bootstrap 類,用于突出顯示文本的一部分。b mark <mark>
在第二行,我們?yōu)?HTML 元素添加了類,稍微減小了字體大小,并將文本轉(zhuǎn)換為大寫。initialism u
在第三行,我們選擇所有具有樣式名稱的段落,并將其轉(zhuǎn)換為具有 Bootstrap 類的 HTML 元素,該類為元素設(shè)置多個(gè)樣式屬性,例如背景顏色、位置和邊框。Heading 1 h1 card
在最后一行,我們將 docx 文件中的所有表格轉(zhuǎn)換為 HTML 元素,并使用 Bootstrap 的類來給它一個(gè)新的外觀,同時(shí)我們通過添加 Bootstrap 類使其在懸停時(shí)高亮顯示。table table table-hover
和之前一樣,我們使用點(diǎn)符號將多個(gè)類映射到同一個(gè) HTML 元素,即使這些樣式來自另一個(gè)來源。
最后,將 Bootstrap CDNs 添加到我們的 HTML 中:
edited_html = bootstrap_css + html + bootstrap_js
現(xiàn)在可以分享我們的 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 rel="external nofollow" rel="external nofollow" 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)
此外,需要注意的一點(diǎn)是,在實(shí)際情況下,你可能不會像我們在這里所做的那樣直接將 Bootstrap CSS 添加到 HTML 內(nèi)容中。相反,你會將 HTML 內(nèi)容加載或注入到一個(gè)特殊的 HTML 頁面中,該頁面已經(jīng)包含了必要的 CSS 和 JS 捆綁包。
Mammoth 還允許我們修改我們正在轉(zhuǎn)換的內(nèi)容。
處理我們不想分享的圖片
假設(shè)我們希望跳過 DOCX 文件中的圖像不進(jìn)行轉(zhuǎn)換。convert_to_html()方法接受一個(gè)convert_image參數(shù),這是一個(gè)圖像處理函數(shù)。它返回一個(gè)應(yīng)該轉(zhuǎn)換并添加到 HTML 文檔中的圖像列表。
當(dāng)然,如果我們覆蓋它并返回一個(gè)空列表,它們將從轉(zhuǎn)換后的頁面中省略:
def ignore_image(image):
return []
現(xiàn)在,讓我們將該函數(shù)作為參數(shù)傳遞到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)
就是這樣! Mammoth 在生成 HTML 文件時(shí)將忽略所有圖像。
到目前為止,我們一直在用 Python 編程方式使用 Mammoth。Mammoth 也是一個(gè)命令行工具,因此我們有了另一個(gè)將 DOCX 轉(zhuǎn)換為 HTML 的接口。讓我們在下一節(jié)中看看它的工作情況。
使用命令行工具將 DOCX 轉(zhuǎn)換為 HTML
使用 Mammoth 的 CLI 進(jìn)行文件轉(zhuǎn)換通常如下所示:
mammoth path/to/input_filename.docx path/to/output.html
如果你想將圖像從 HTML 中分離出來,可以指定一個(gè)輸出文件夾:
mammoth file-sample_100kB.docx --output-dir=imgs
我們也可以像在 Python 中那樣添加自定義樣式。首先需要?jiǎng)?chuàng)建一個(gè)自定義樣式文件:
touch my-custom-styles
然后,我們將在其中添加自定義樣式,語法與之前相同:
b => b.red u => em.red p[style-name='Heading 1'] => h1.red.underline
現(xiàn)在我們可以生成帶有自定義樣式的 HTML 文件:
mammoth file-sample_100kB.docx output.html --style-map=my-custom-styles
大功告成!您的文檔已按定義的自定義樣式進(jìn)行轉(zhuǎn)換。
結(jié)語
文件類型轉(zhuǎn)換在處理網(wǎng)頁技術(shù)時(shí)是一種常見需求。將 DOCX 文件轉(zhuǎn)換為易于操作的 HTML 格式,使我們能夠根據(jù)需要重建數(shù)據(jù)。使用 Mammoth,我們學(xué)會了如何從 docx 中提取文本并將其轉(zhuǎn)換為 HTML。
在轉(zhuǎn)換為 HTML 時(shí),我們可以使用我們創(chuàng)建的 CSS 規(guī)則或常見的 UI 框架提供的規(guī)則來樣式化輸出。我們還可以省略不需要在 HTML 中可用的數(shù)據(jù)。
以上就是Python使用Mammoth將DOCX轉(zhuǎn)換為HTML的詳細(xì)內(nèi)容,更多關(guān)于Python Mammoth將DOCX轉(zhuǎn)HTML的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
對pandas replace函數(shù)的使用方法小結(jié)
今天小編就為大家分享一篇對pandas replace函數(shù)的使用方法小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
安裝python-docx后,無法在pycharm中導(dǎo)入的解決方案
這篇文章主要介紹了安裝python-docx后,無法在pycharm中導(dǎo)入的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Python實(shí)現(xiàn)的線性回歸算法示例【附csv文件下載】
這篇文章主要介紹了Python實(shí)現(xiàn)的線性回歸算法,涉及Python使用最小二乘法、梯度下降算法實(shí)現(xiàn)線性回歸相關(guān)算法操作與使用技巧,需要的朋友可以參考下2018-12-12
Python輕松實(shí)現(xiàn)查找高亮Excel指定數(shù)據(jù)
在日常工作中,Excel表格無疑是我們處理數(shù)據(jù)最常用的工具之一,本文將深入探討如何利用 Free Spire.XLS for Python 免費(fèi)庫完成這一任務(wù),讓你的數(shù)據(jù)處理工作效率倍增,希望對大家有所幫助2025-11-11
Python類中的裝飾器在當(dāng)前類中的聲明與調(diào)用詳解
這篇文章主要介紹了Python類中的裝飾器在當(dāng)前類中的聲明與調(diào)用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Python算法應(yīng)用實(shí)戰(zhàn)之隊(duì)列詳解
隊(duì)列是一種先進(jìn)先出(First-In-First-Out,F(xiàn)IFO)的數(shù)據(jù)結(jié)構(gòu)。隊(duì)列被用在很多地方,比如提交操作系統(tǒng)執(zhí)行的一系列進(jìn)程、打印任務(wù)池等,一些仿真系統(tǒng)用隊(duì)列來模擬銀行或雜貨店里排隊(duì)的顧客。下面就介紹了Python中隊(duì)列的應(yīng)用實(shí)戰(zhàn),需要的可以參考。2017-02-02
Python設(shè)置在shell腳本中自動(dòng)補(bǔ)全功能的方法
今天小編就為大家分享一篇Python設(shè)置在shell腳本中自動(dòng)補(bǔ)全功能的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06

