【问题标题】:How to extract text from an existing docx file using python-docx如何使用 python-docx 从现有 docx 文件中提取文本
【发布时间】:2014-10-03 09:15:48
【问题描述】:

我正在尝试使用 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)。

有什么问题?为什么缺少 URL?

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

【问题讨论】:

  • 请注意旧的 GitHub 存储库 github.com/mikemaccana/python-docx 有“这个项目已移动!”在标题 1 中。
  • 另外,所有编号的列表都不会导出为文本...

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


【解决方案1】:

你可以试试这个

import docx

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

【讨论】:

  • 这是一个好的开始,它不会反映表格、页眉、页脚和脚注中的文本。
  • 考虑使用simplify-docx,它基于python-docx,大大降低了XML文档的复杂性,同时保留了大部分结构(段落、表格、页眉、页脚等)
  • 这与提问者作为一种方法有何不同?事实上,它更糟糕,因为它创建了一个愚蠢且无用的列表而不是文本!我看到 59 票赞成!!他们实际上应该是downvotes! (我没有投反对票,因为我从来没有投反对票。我更愿意解释为什么像这样的回复真的很糟糕!)
【解决方案2】:

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

【讨论】:

【解决方案3】:

你也可以试试这个

from docx import Document

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

【讨论】:

  • 简单完美!谢谢!
  • 这与提问者所做的有什么不同???你们怎么了?天哪!
【解决方案4】:

不安装python-docx

docx 基本上是一个 zip 文件,其中包含多个文件夹和文件。在下面的链接中,您可以找到一个从docx 文件中提取文本的简单函数,而无需依赖python-docxlxml,后者有时很难安装:

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

【讨论】:

  • 我通过您的代码“zipfile.BadZipFile: File is not a zip file”得到了这个。为什么会这样?
  • 这段代码以前对我有用。你能上传你的 docx 文件并提供一个我可以测试的链接吗?
【解决方案5】:

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

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

当前版本不支持读写超链接。该功能已在路线图上,并且该项目正在积极开发中。事实证明它是一个相当广泛的 API,因为 Word 具有如此多的功能。所以我们会解决它,但可能不会在下个月,除非有人决定专注于该方面并做出贡献。 更新在此答案之后添加了超链接支持。 更新 p>

【讨论】:

  • 这个问题已经在最新版本中修复了 - 从 github 很难分辨
【解决方案6】:

使用 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])

【讨论】:

    【解决方案7】:

    我遇到了类似的问题,所以我找到了一种解决方法(通过正则表达式删除超链接标签,以便只保留一个段落标签)。我在https://github.com/python-openxml/python-docx/issues/85 上发布了这个解决方案 血压

    【讨论】:

      【解决方案8】:

      这个问题好像没有官方解决方案,但是这里贴了一个变通方法 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
      
      

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

      【讨论】:

        猜你喜欢
        • 2014-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-06
        • 2022-08-16
        相关资源
        最近更新 更多