wordファイル(.docx)から本文テキストを抽出する方法のメモ。
docx ファイルは zip ファイルになっているため、zip ファイルとして読み込み、
word/document.xml から本文を抽出します。
以下のプログラムでは、ルビを除去するため、<w:rt>タグを削除しています。
docx ファイルは zip ファイルになっているため、zip ファイルとして読み込み、
word/document.xml から本文を抽出します。
以下のプログラムでは、ルビを除去するため、<w:rt>タグを削除しています。
import sys import json import re import lxml.etree import zipfile def extract_text(node): text = lxml.etree.tostring(node, encoding='utf-8').decode('utf-8') text = re.sub('<w:rt>.*?</w:rt>', '', text) text = re.sub('<.*?>', '', text) return text def run(): xmlns = {'w':'http://schemas.openxmlformats.org/wordprocessingml/2006/main'\ } zip = zipfile.ZipFile(sys.argv[1]) if zip is None: sys.stderr.write('error: failed to open %s' % (sys.argv[0])) return 1 xmlstr = zip.read('word/document.xml') dom = lxml.etree.fromstring(xmlstr) text_nodes = dom.xpath('//w:p', namespaces=xmlns) for text_node in text_nodes: text = extract_text(text_node) if text == '': continue print(text) zip.close() return 0 if __name__ == '__main__': res = run() exit(res)