10

我正在使用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?

...但我没有看到任何关于orRun的信息。我必须直接回退到 XML 还是有更好、更简洁的方法来迭代文档中的所有内容?InlineShapeTable

谢谢!

4

2 回答 2

8

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

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

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

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

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

于 2014-08-05T05:27:03.590 回答
1

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

  • 一个用于段落,就像您在代码中一样
  • 一个用于桌子,通过doc.tables
  • 一种用于形状,通过doc.inline_shapes

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

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

于 2014-08-05T04:27:54.580 回答