【问题标题】:How to iterate over everything in a python-docx document?如何遍历 python-docx 文档中的所有内容?
【发布时间】:2014-08-05 03:57:45
【问题描述】:

我正在使用python-docx 将 Word docx 转换为自定义 HTML 等效项。我需要转换的文档有图像和表格,但我无法弄清楚如何在给定的运行中访问图像和表格。这就是我的想法......

for para in doc.paragraphs:
    for run in para.runs:
        # How to tell if this run has images or tables?

...但我在Run 上看不到任何包含InlineShapeTable 信息的内容。我必须直接回退到 XML,还是有更好、更简洁的方法来迭代文档中的所有内容?

谢谢!

【问题讨论】:

  • 谁能猜到?我也是!

标签: python python-docx


【解决方案1】:

实际上有两个问题需要解决。第一个是按文档顺序遍历文档中的所有块级元素。第二个是遍历每个块元素中的所有内联元素,按照它们出现的顺序。

python-docx 还没有您直接执行此操作所需的功能。但是,对于第一个问题,这里有一些示例代码可能对您有用: https://github.com/python-openxml/python-docx/issues/40

据我所知,没有确切的对应物可以处理内联项,但我希望您可以在使用paragraph.runs 时走得更远。所有内联内容都将在一个段落内。如果您已经完成了大部分工作并且只是忙于获取图片或其他内容,那么您可以进入 lxml 级别并解码一些 XML 以获得您需要的内容。如果你走得那么远并且仍然热衷于,如果你在 GitHub 问题列表上发布一个功能请求,比如“功能:Paragraph.iter_inline_items()”,我可能会为你提供一些类似的代码来获得你需要的东西。

这个要求不时出现,所以我们一定会在某个时候添加它。

请注意,块级项目(主要是段落和表格)可以递归地出现,一般的解决方案需要考虑到这一点。特别是,一个段落可以(实际上至少总是必须)出现在表格单元格中。表格也可以出现在表格单元格中。所以理论上它可以变得很深。递归函数/方法是获取所有这些的正确方法。

【讨论】:

  • 谢谢!这给了我一个很好的下一步。我会看看是否可以添加用于迭代段落中的内联项的代码。
  • 不幸的是,第 40 期的代码不再适用于提交 e784a73 中的更改。有更新的代码吗?
  • 如果您可以在该问题上添加一个帖子,说明您正在尝试的内容和无效的内容,我会看看是否可以提供帮助。在我看来,它确实有效,只是并非所有内容都在该问题的一篇文章中。
【解决方案2】:

假设doc 的类型为Document,那么您要做的是进行3 次单独的迭代:

  • 一个用于段落,就像您在代码中所做的那样
  • 一个用于桌子,通过doc.tables
  • 一个用于形状,来自doc.inline_shapes

您的代码不起作用的原因是段落没有引用文档中的表格和/或形状,因为它们存储在 Document 对象中。

这里是更多信息的文档:python-docx

【讨论】:

  • 感谢您的快速回复。我怎么知道它们在原始文档中出现的顺序?
  • 文档/api中似乎没有任何内容。也许您可以添加功能请求。在当前状态下,python-docx 似乎更适合创建 .docx 文件而不是读取它们。
  • 您可能想考虑编写自己的解析器,因为 .docx 文件本质上是一个 XML 文件。以下是一些起点:virantha.com/2013/08/16/…lxml.de
猜你喜欢
  • 2020-11-08
  • 1970-01-01
  • 2015-08-28
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
相关资源
最近更新 更多