使用olefile从Word .doc中提取文本

问题描述 投票:1回答:1

我只关心从.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的替代品)

python windows ms-word
1个回答
0
投票

我不确定,但我认为问题是olefile不了解Word文档,只有OLE“流”。所以我猜你提取的数据不仅仅包含纯文本,还有某种控制字符。所以我猜这就是为什么你不能解码你得到的数据为utf-16。

有一些Python模块可以从doc文件转换,但它们只适用于Linux,它们使用命令行实用程序antiwordcatdoc

我尝试了其他前进的道路 - 如果问题是你没有Word的许可证,但是否则可以安装软件,LibreOffice可能是一条前进的道路。使用此命令,我将包含doc格式的中文字母的Word测试文件转换为HTML:

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

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


Too bad you don't have Word installed, or you could have made it do the work for you. Leaving that solution here in case someone else has use for it:
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()
© www.soinside.com 2019 - 2024. All rights reserved.