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

标签 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 的替代方案)

最佳答案

我不确定,但我认为问题在于olefile无法理解Word文档,只能理解OLE“流”。所以我猜你提取的数据不仅仅是纯文本,还有某种控制字符。所以我想这就是为什么您无法将获得的数据解码为 UTF-16。

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

我尝试了其他解决方案 - 如果问题是您没有 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()

关于python - 使用 olefile 从 Word .doc 中提取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51943121/

相关文章:

python - 我无法通过 pip 安装 kivy

windows - 计划任务调用的批处理文件在计划时抛出错误,双击时运行正常

windows - 在 Windows 中, "The exception unknown software exception (0x40000015) occurred in the application"是否表示 STATUS_FATAL_APP_EXIT?

c++ - 在 Word 中迭代段落

python - 通过 python 设置 SQLite 数据库的(默认)编码

python - 从线程更新全局变量并从python中的main访问

python - 尝试安装程序时,python 上的 ssl 证书验证失败

c++ - 如果我不先创建 TCP 连接,为什么发送数据报不起作用?

php - 在 php 中将 MS Word 文档转换为 html

c# - MS Word 2010 无法打开宏存储