【筆記】python docx 抓圖
需求:
給你一個 word 檔,裡面有表格,表格部分欄位裡面有文字、圖片,一列就是一組單位,如下圖,第二列、第三欄就有文字跟兩張圖
我們要如何抓取一整列的內容,並且依序放入 json 呢?
先學習如何使用 python-docx
套件 doc:python-docx
使用方法:參考 Day20-Python 操作 docx 文件
Note- 讀取 docx 文件
import docx
from docx import Document #导入库path = "/home/jovyan/work/JunyiDataAnalysis/Young/107.docx" #文件路径document = Document(path) #读入文件
tables = document.tables #获取文件中的表格集
table = tables[1] #获取文件中的第一个表格
先依據文件 path 讀取檔案,只能是 docx 格式
讀取 doc 後,可以用 document.tables 抓取表格,表格會以 object 的形式先存在 list 裡面
接下來,你會想在某張 table 的每一格裡面探索,這時候可以把每一個格子當成是一個小 doc,如下:
doc = table.cell(9,5)
paras = doc.paragraphsprint(paras[0].text)
我們先拿到一個 cell,並且取得每一個段落(paragraphs),你便可以拿取每個段落的文字 by .text 這個 function
但是圖檔卻非常難拿,因為 python-docx 文檔只有教你怎麼 add_picture(),也就是怎麼放入圖檔到 word 裡面,卻沒有教你怎麼抓取
網路上,關於這樣的討論也很少,於是參考這兩篇:
簡單來說,就是檢視 docx 的 xml 格式,而 xml 格式裡面有清楚的規則及tag,標注不同格式的內容,因此,我們可以很快速的在每個段落裡面的 xml 找出圖檔及其順序位置
如上述代碼:我們先找到 paragraph 的 xml,並且知道圖檔的 tags 存在 namespace 裡面,逐行去找,且透過一些 attr, 我們會得到 imgs 在段落裡的代碼,通常會長得像這樣:rID1, rID2 …
接下來,可能會想要把它儲存或是丟上雲端,我們先實作 local storage
有了 rID 之後,我們利用 .part.related_parts[rid] 抓去 圖檔 object
doc.part.related_parts[rid]
有了 img object 就可以做儲存等動作了