您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么用Python將word文件轉(zhuǎn)換成html”,在日常操作中,相信很多人在怎么用Python將word文件轉(zhuǎn)換成html問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用Python將word文件轉(zhuǎn)換成html”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
序
最近公司一個客戶大大購買了一堆醫(yī)療健康方面的科普文章,希望能放到我們正在開發(fā)的健康檔案管理軟件上。客戶大大說,要智能推送!要掌握節(jié)奏!要深度學(xué)習(xí)!要讓用戶留戀網(wǎng)站無法自拔!
話說符合以上特點的我也只能聯(lián)想到某榴了。
當(dāng)然,萬里長征的第一步是把文章導(dǎo)入我們的數(shù)據(jù)庫。項目使用的是AWS的dynamoDB,是非關(guān)系型數(shù)據(jù)庫,所有內(nèi)容都是以json的形式儲存的。而客戶大大購買來的文章,一共600多篇,要么是word要么是Adobe indesign的indd。找了一圈,沒有發(fā)現(xiàn)合適的應(yīng)用可以把word或indd轉(zhuǎn)化成干凈的html。所以我只能自己造輪子啦~聽說python很擅長文本處理,所以就是你了,python!這是我第一次用python寫項目,不符合規(guī)范的地方歡迎大神提點。
太長不看
用逆天的python 模塊mammoth和docx 處理你的word文件;把indd批量轉(zhuǎn)化成pdf然后用layout_scanner轉(zhuǎn)化成html。
word批量轉(zhuǎn)化為html
1、 建立文件結(jié)構(gòu)并批量讀取文件
在根目錄下創(chuàng)建幾個文件夾,用來放不同格式的文件,我把所有要處理的word文件放在docfiles 這個子目錄里。word.py里寫轉(zhuǎn)化程序。
1. ├── docfiles
2.
3. ├── imgs
4.
5. ├── inddfiles
6.
7. ├── output
8.
9. └── pdfs
10.
11. └── word.py
2、引入模塊和申明文件路徑
1. import mammoth
2. import mammoth.transforms
3. import os
4. from docx import Document
5. from bson import json_util
6. import zipfile
7. import json
8. import unidecode
9. import requests
10.
11. guidUrl = "https://my.phrplus.com/REST/guid"
12. inputPath = '/Users/admin/cwell/parser/docfiles/'
13. imgPath = "/Users/admin/cwell/parser/imgs/"
14. outputFile = '/Users/admin/cwell/parser/output/output.json'
mammoth: 核心組件,用來做轉(zhuǎn)化工作
docx: 另一個做轉(zhuǎn)化工作的模塊,用來補充mammoth
os: 用來在系統(tǒng)中讀取寫入文件
zipfile: 用來解壓word文檔以提取圖片
json: 用來把數(shù)據(jù)轉(zhuǎn)化成json
bson: 用來配置寫入json文件
unicode:用來處理字符
requests:用來調(diào)用api
3、轉(zhuǎn)換單個文件
1. styleMap = """
2. p[style-name='Title'] => h2.hide
3. p[style-name='Subhead 1'] => h4
4. p[style-name='List Bullet'] => ul.first > li:fresh
5. p[style-name='List Bullet 2'] => ul.second > li:fresh
6. p[style-name='Hyperlink']=>a.link
7. """
8. def convert_image(image):
9. return {
10. "src":""
11. }
12.
13. def parseFile(f):
14. document = Document(inputPath+f)
15. article = {"Title":document.core_properties.title,"Content":""}
16. with open(inputPath+f,"rb") as docFile:
17. html = mammoth.convert_to_html(docFile,style_map=styleMap,convert_image=mammoth.images.img_element(convert_image))
18. decoded = unidecode.unidecode(html.value)
19.
20.
21. if not article["Title"]:
22. for para in document.paragraphs:
23. if para.style.name == 'Title':
24. if para.text:
25. article["Title"] = para.text
26.
27. article["Content"]=decoded
28. return article
parseFile就是核心功能了。傳遞進來的參數(shù)f是文件名,和文件路徑合在一起能夠幫我們準確定位要轉(zhuǎn)化的文件。首先用docx找到文檔的標題,并創(chuàng)建一個dictionary,里面包含標題和內(nèi)容。然后用mammoth轉(zhuǎn)化整個文件。注意命令中要用到stylemap和convertimage。前者用來規(guī)定轉(zhuǎn)化規(guī)則:'style-name'是word里的式樣名稱,用word打開文檔,點擊任意一個元素可以查看其式樣名稱;這里規(guī)定標題轉(zhuǎn)化為h2,副標題轉(zhuǎn)化為h3等等。關(guān)于列表的轉(zhuǎn)化規(guī)則這里就不詳細敘述了,具體可以參考下面的文章:
參考鏈接
1. Converting docx to clean HTML: handling the XML structure mismatch
'convert_image' 是用來規(guī)定圖片的轉(zhuǎn)化方式的,由于我準備之后批處理所有文檔中的圖片,在這里就告訴程序不儲存任何圖片信息。但是于此同時保留圖片的img tag以便標注圖片在文檔中的位置。如果不規(guī)定任何轉(zhuǎn)化方式,生成的html里面會包含一大長串base64的圖片信息。
mammoth轉(zhuǎn)化出來的html是含有unicode的,不知道為什么python里跑一直報錯,就用unicode解碼了一下。
這之后,如果前面的程序沒有抓取到文檔標題,用docx換個姿勢再抓取一下。
最后返回article這個dictionary。
4、抓取圖片
1. def extractImage(f):
2. ziped = zipfile.ZipFile(inputPath+f)
3. allFiles = ziped.namelist()
4. imgs = filter(lambda x: x.startswith('word/media/'), allFiles)
5. imgNameArr = []
6. for img in imgs:
7. res = requests.post(guidUrl)
8. if res.status_code is 200:
9. guid = res.text
10. data = ziped.read(img,imgPath)
11. idxStr = os.path.basename(img).split(".")[0][-1:]
12. imgDict = {}
13. imgDict["index"] = int(idxStr)-1
14. imgDict["fileName"] = guid+".jpg"
15. imgNameArr.append(imgDict)
16. targetPath = os.path.join(imgPath,guid+".jpg")
17. target = open(targetPath,"wb")
18. target.write(data)
19. target.close()
20. ziped.close()
21. return imgNameArr
沒想到word文檔其實是一個壓縮文件吧?如果直接把word文檔的后綴名改成zip然后再用解壓軟件查看,會看到一個media文件夾,里面就包含所有插入的圖片。
用ziped讀取文檔,然后找到存放圖片的media文件夾,每一個圖片重新用guid命名,生成一個dictionary,里面包含的信息有“此圖片在文檔中出現(xiàn)的順序”和文件名。話說media中的圖片都被按照順序重新命名為image1.png, image2.png,剛好為我們抓取順序信息提供了方便。
(python也有生成guid的模塊,我在這里調(diào)用api有點多此一舉,但是為了和項目中其他圖片需要用到的uuidv4保持一致還是用了)
之后就是把圖片存在‘imgs’這個文件夾下。
5、生成json
1. def processDocs(path):
2. result = []
3. for f in os.listdir(path):
4. if not f.startswith('.'):
5. imgNameArr = extractImage(f)
6. article = parseFile(f)
7. fileName = os.path.basename(f)
8. contentArr = article["Content"].split("<img")
9. for idx, section in enumerate(contentArr):
10. for info in imgNameArr:
11. if idx is info["index"]:
12. contentArr[idx] = section+"<img alt='"+info["fileName"]+"' data-fileName='"+info["fileName"]+"'"
13.
14. article["Content"] = ''.join(contentArr)
15. result.append(article)
16.
17.
18. with open(outputFile,'w+') as f:
19. json.dump(result,f,default=json_util.default)
最后要用到的一個function就是寫個循環(huán)挨個處理docfiles文件夾底下的文件了。針對每一個文件,記得把之前生成的圖片信息的數(shù)組map到html里,然后在寫入到json文件里就大功告成了!
indd轉(zhuǎn)化為html
話說,到現(xiàn)在為止,我還沒有找到一個完美的解決方案。我使用了相同的思路,把indd先批量生成為pdf(有一個indesign 腳本就是專門批量轉(zhuǎn)化pdf的),然后用了一個叫做layout_scanner的github項目抓取pdf信息并轉(zhuǎn)化為html。最后生成的html包含了文字和圖片,但是圖標和排版就保存不下來了??蛻舸蟠蟊硎静粷M意。我也很惆悵?。C智的小伙伴們?nèi)绻懈玫乃悸氛垊?wù)必告訴我!如果需要我詳細說明一下這一塊內(nèi)容,我會更新在這篇文章中。
到此,關(guān)于“怎么用Python將word文件轉(zhuǎn)換成html”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。