dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

wordファイル(.docx)から本文テキストを抽出する方法

2020-08-12 22:31:43 | python
wordファイル(.docx)から本文テキストを抽出する方法のメモ。

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)