使用olefile从Word .doc提取文本

时间:2018-08-21 06:51:14

标签: python windows ms-word

我只关心从.doc文件中获取文本。我在Windows 10上使用python 3.6,因此textract / antiword不在桌面上。我查看了this question中的其他参考,但是它们都比较旧并且与Windows 10和/或python 3.6不兼容。

我的文档是一个中文和英文混合的.doc文件。我不熟悉Word如何存储其文件,并且我的计算机上没有Word。使用olefile,我可以获取文档的字节,但是我不知道如何正确遍历标题和布局以提取文本。如果我天真尝试

from olefile import OleFileIO as ofio
ole = ofio('d.doc')
stream = ole.openstream('WordDocument')
data = stream.read()
data.decode('utf-16')
>>>UnicodeDecodeError: 'utf-16-le' codec can't decode bytes in position 9884-9885: illegal encoding
data[9884:9885]
>>>b'\xfa'
data[:9884].decode('utf-16')

然后,最后一行给了我大约一半的文档,以很多垃圾字符开头和结尾。我怀疑我可以继续尝试使用这种方法来逐段获取文本,但最终我需要对许多文件执行此操作。即使我这样做,也无法想到自动化它的好方法。如何使用olefile从.doc中可靠地获取文本?

(如果您知道可以使用我的规范的话,也可以在答案中包括olefile的替代项)

1 个答案:

答案 0 :(得分:0)

我不确定,但是我认为问题在于olefile不了解Word文档,只有OLE“流”。因此,我想您提取的数据不仅包含纯文本,还包含某种控制字符。因此,我想这就是为什么您无法解码以utf-16格式获取的数据的原因。

有些Python模块可以从doc文件转换,但是它们往往仅在使用命令行实用程序antiwordcatdoc的Linux上工作。

我尝试了其他方法-如果问题是您没有Word的许可证,但可以安装软件,则LibreOffice可能是一种方法。使用此命令,我将具有中文字母的Word测试文件从 doc 格式转换为 HTML

"c:\Program Files\LibreOffice\program\swriter.exe" --convert-to html d.doc

LibreOffice也可以转换为许多其他格式,但是HTML应该足够简单以便进一步处理。我也尝试过a port of catdoc to Windows,但无法处理中文字母。


不幸的是您没有安装Word,或者您可以让它为您完成工作。如果有人使用它,请将该解决方案留在这里:

import win32com.client

app = win32com.client.Dispatch("Word.Application")

try:
    app.visible = False
    wb = app.Documents.Open('c:/temp/d.doc')
    doc = app.ActiveDocument

    with open('out.txt', 'w', encoding = 'utf-16') as f:
        f.write(doc.Content.Text)

except Exception as e:
    print(e)

finally:
    app.Quit()