【问题标题】:Using olefile to extract text from Word .doc使用 olefile 从 Word .doc 中提取文本
【发布时间】:2018-08-21 06:51:13
【问题描述】:

我只关心从 .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】:

我不确定,但我认为问题在于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()

【讨论】:

  • 谢谢,到目前为止它工作正常,虽然处理中文、英文和图片有点挑剔。同样使用 Windows 10 上的 LibreOffice 6.1.0,您需要指定 outdir: .\soffice --headless --convert-to html --outdir C:\Users\windows\Desktop C:\Users\windows\Desktop\d.doc
  • @tigerninjaman,很高兴听到!由于您要使用此解决方案,请注意对swriter.exe 的调用(我猜soffice.exe 也是)不会阻塞- 应用程序从DOS 窗口完成在生成输出文件之前。它继续在后台运行,直到转换完成。此外,如果 HTML 难以解析,则可能值得研究 LibreOffice 可以生成的所有其他输出格式,例如 docx、RTF、Abiword 格式和 DocBook en.wikipedia.org/wiki/DocBook 对于 HTML 解析: crummy.com/software/BeautifulSoup
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多