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

时间:2014-08-10 11:24:55

标签: python python-2.7 python-3.x python-docx

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

第一个(opendocx)无效,可能已被弃用。对于第二种情况,我试图使用:

from docx import Document

document = Document('test_doc.docx')

print document.paragraphs

它返回了<docx.text.Paragraph object at 0x... >

的列表

然后我做了:

for p in document.paragraphs:
    print p.text

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

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

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

8 个答案:

答案 0 :(得分:34)

你可以试试这个

import docx

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

答案 1 :(得分:9)

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

答案 2 :(得分:7)

不安装python-docx

docx基本上是一个包含多个文件夹和文件的zip文件。在下面的链接中,您可以找到一个简单的函数来从docx文件中提取文本,而无需安装有时会产生问题的python-docxlxml

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

答案 3 :(得分:4)

python-docx有两代“代”。最初的一代以0.2.x版本结束,“新”代开始于v0.3.0。新一代是旧版本的基于面向对象的重写。它有一个distinct repository located here

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

当前版本不支持读取或写入超链接。该功能在路线图上,项目正在积极开发中。事实证明它是一个相当广泛的API,因为Word具有如此多的功能。所以我们会接受它,但可能不会在下个月,除非有人决定专注于这方面并做出贡献。

答案 4 :(得分:3)

你也可以尝试这个

from docx import Document

document = Document('demo.docx')
for para in document.paragraphs:
    print(para.text)

答案 5 :(得分:1)

使用python-docx,@ Chinmoy Panda的回答显示:

for para in doc.paragraphs:
    fullText.append(para.text)

但是,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])

答案 6 :(得分:0)

我有一个类似的问题所以我找到了一个解决方法(由于正则表达式删除了超链接标记,所以只剩下一个段落标记)。我在https://github.com/python-openxml/python-docx/issues/85上发布了此解决方案 BP

答案 7 :(得分:0)

这个问题似乎没有官方的解决方案,但是这里发布了一个解决方法 https://github.com/savoirfairelinux/python-docx/commit/afd9fef6b2636c196761e5ed34eb05908e582649

只需更新此文件 "...\site-packages\docx\oxml_init_.py"

# add
import re
import sys

# add
def remove_hyperlink_tags(xml):
    if (sys.version_info > (3, 0)):
        xml = xml.decode('utf-8')
    xml = xml.replace('</w:hyperlink>', '')
    xml = re.sub('<w:hyperlink[^>]*>', '', xml)
    if (sys.version_info > (3, 0)):
        xml = xml.encode('utf-8')
    return xml
    
# update
def parse_xml(xml):
    """
    Return root lxml element obtained by parsing XML character string in
    *xml*, which can be either a Python 2.x string or unicode. The custom
    parser is used, so custom element classes are produced for elements in
    *xml* that have them.
    """
    root_element = etree.fromstring(remove_hyperlink_tags(xml), oxml_parser)
    return root_element

当然不要忘记在文档中提到使用正在更改官方库