如何使用python-docx从现有docx文件中提取文本

Nan*_*ncy 39 python python-2.7 python-3.x python-docx

我正在尝试使用python-docxmodule(pip install python-docx),但它似乎非常混乱,因为在github repo测试样本中他们使用的是opendocx函数,但在readthedocs中他们正在使用Document类.即使他们只是展示如何将文本添加到docx文件而不是读取现有文件?

第一个(opendocx)不起作用,可能会被弃用.对于第二种情况,我试图使用:

from docx import Document

document = Document('test_doc.docx')

print document.paragraphs
Run Code Online (Sandbox Code Playgroud)

它返回了一份清单 <docx.text.Paragraph object at 0x... >

然后我做了:

for p in document.paragraphs:
    print p.text
Run Code Online (Sandbox Code Playgroud)

它返回了所有文本,但缺少一些东西.控制台上的文本中不存在所有URL(CTRL + CLICK转到URL).

有什么问题?为什么缺少网址?

如何在不迭代循环的情况下获得完整的文本(类似open().read())

小智 38

你可以试试这个

import docx

def getText(filename):
    doc = docx.Document(filename)
    fullText = []
    for para in doc.paragraphs:
        fullText.append(para.text)
    return '\n'.join(fullText)
Run Code Online (Sandbox Code Playgroud)

  • 这与提问者所采用的方法有何不同?事实上,情况更糟,因为它创建了一个愚蠢且无用的列表而不是文本!我看到 59 票赞成!他们实际上应该投反对票!(我没有投反对票,因为我从来没有这样做。我更喜欢解释为什么像这样的回复真的很糟糕!) (8认同)
  • 考虑使用基于 python-docx 的 [simplify-docx](https://github.com/microsoft/Simplify-Docx),它大大降低了 XML 文档的复杂性,同时保留了大部分结构(段落、表格、标题、页脚等) (3认同)
  • 这是一个好的开始,它不会在表格,页眉,页脚和脚注中反映文本。 (2认同)

use*_*708 14

你也可以试试这个

from docx import Document

document = Document('demo.docx')
for para in document.paragraphs:
    print(para.text)
Run Code Online (Sandbox Code Playgroud)

  • 简单又完美!谢谢! (2认同)

Ank*_*hah 10

你可以使用改编自python-docx的python-docx2txt,但也可以从链接,页眉和页脚中提取文本.它还可以提取图像.


ima*_*bet 9

没有安装 python-docx

docx基本上是一个zip文件,里面有几个文件夹和文件.在下面的链接,你可以找到一个简单的函数来提取文本docx文件,而不需要安装python-docxlxml它有时会产生问题:

http://etienned.github.io/posts/extract-text-from-word-docx-simply/

  • 这仍然有效,但是 .getiterator( 已被弃用,必须替换为 .iter( 现在 https://docs.python.org/3.9/whatsnew/3.9.html#removed (2认同)

Xin*_*Shi 7

使用 python-docx,如 @Chinmoy Panda 的答案所示:

for para in doc.paragraphs:
    fullText.append(para.text)
Run Code Online (Sandbox Code Playgroud)

但是,para.text 会丢失其中的文本w:smarttag(相应的 github 问题在这里: https: //github.com/python-openxml/python-docx/issues/328),您应该使用以下函数:

def para2text(p):
    rs = p._element.xpath('.//w:t')
    return u" ".join([r.text for r in rs])
Run Code Online (Sandbox Code Playgroud)


sca*_*nny 5

python-docx有两代。最初的版本以0.2.x版本结束,“新一代”版本从v0.3.0开始。新一代是对旧版本的全新,面向对象的重写。它在此处有一个独特的存储库

opendocx()函数是旧版API的一部分。该文档适用于新版本。旧版本没有文档可言。

当前版本不支持读取或写入超链接。该功能正在规划中,并且该项目正在积极开发中。事实证明,这是一个相当广泛的API,因为Word具有如此众多的功能。因此,我们将继续进行下去,但是除非有人决定专注于该方面并做出贡献,否则下个月可能不会。