【问题标题】:How to read docx originated from Word templates with python-docx?如何使用 python-docx 读取源自 Word 模板的 docx?
【发布时间】:2021-04-01 08:53:34
【问题描述】:

我正在使用 python-docx 库获取 docx 文件的所有文本。其简化代码如下

from docx import Document

def read_element(doc):
    for p in doc.paragraphs:
        print('paragraph text:', p.text)
    for table in doc.tables:
        for row in table.rows:
            for cell in row.cells:
                read_element(cell)

doc = Document("<path to file>")

read_element(doc)

这在许多情况下都非常有效,除非我从通过 Microsoft Word 模板生成的文件中读取。在这些情况下,它只读取我在文件中写入的输入,而不是模板附带的文本

复制

  • 通过Create from template 创建 Microsoft Word 文档
  • 在里面写一个字,即“测试”
  • 保存
  • 在上面的代码中替换它的路径
  • 运行代码

输出:

paragraph text:  testing
paragraph text: To learn more and get OneNote, visit .

当文件的文本多于输出内容时

做笔记测试

  • 要记笔记,只需点按此处并开始输入。
  • 或者,使用免费的 OneNote 应用,轻松为您的所有笔记创建一个数字笔记本,并在您的设备之间自动同步。

如需了解详情并获取 OneNote,请访问www.onenote.com

我们也可以在我们尝试读取的文件图像中看到Docx file

关于如何找回丢失的文本有什么想法吗?

【问题讨论】:

    标签: python ms-word python-docx


    【解决方案1】:

    python-docx 只会在文档的顶级 中找到段落和表格。特别是,不会检测到“包装”在“容器”元素中的段落或表格。

    最常见的是,“容器”是待定(尚未接受)的修订版,这会产生类似的行为。

    要提取“包装”文本,您需要知道“包装”元素是什么。一种方法是转储文档正文的 XML:

    document = Document("my-document.docx")
    print(document._body._body.xml)
    

    段落元素有一个w:p 标记,您可以检查输出以查找那些,我希望其中一些将在内部另一个元素。

    然后您可以使用 XPath 表达式提取这些元素,类似这样,如果“包装器”元素是 &lt;w:x&gt;,这将起作用:

    from docx.text.paragraph import Paragraph
    
    body = document._body._body
    ps_under_xs = body.xpath("w:x//w:p")
    for p in ps_under_xs:
        paragraph = Paragraph(p, None)
        print(paragraph.text)
    

    您也可以只获取文档中的所有 &lt;w:p&gt; 元素,而不考虑它们的“父代”,如下所示:

    ps = body.xpath(".//w:p")
    

    这样做的缺点是某些容器(如未接受的修订标记)可能包含已从文档中“删除”的文本,因此您可能会得到比您想要的更多的内容。

    无论如何,这种通用方法应该适用于您所描述的工作。如果您需要更复杂的内容,可以在搜索中找到有关 XPath 表达式的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多