如何遍历python-docx文档中的所有内容?
我正在使用 python-docx
这个工具,把一个Word文档(docx格式)转换成自定义的HTML格式。这个文档里有图片和表格,但我还没找到怎么在特定的文本段落(称为“run”)中访问这些图片和表格。我在想……
for para in doc.paragraphs:
for run in para.runs:
# How to tell if this run has images or tables?
……但是我在这个 Run
中没有看到任何关于 InlineShape
(内嵌形状)或 Table
(表格)的信息。我是不是得直接去处理XML文件,还是说有更简单、更干净的方法可以遍历文档里的所有内容呢?
谢谢!
2 个回答
假设 doc
是一个文档类型的对象,那么你需要进行三次不同的操作:
- 第一次是处理段落,就像你代码中那样
- 第二次是处理表格,可以通过
doc.tables
来获取 - 第三次是处理形状,可以通过
doc.inline_shapes
来获取
你之前的代码没有正常工作是因为段落并不包含对文档中表格和形状的引用,这些信息是存储在 Document
对象里的。
想了解更多信息,可以查看这个文档: python-docx
其实你要解决的问题有两个。第一个是要按照文档的顺序,遍历文档中的所有块级元素。第二个是要在每个块级元素内,按照它们出现的顺序遍历所有的行内元素。
目前,python-docx 还没有直接支持这些功能。不过,对于第一个问题,这里有一些示例代码,可能对你有帮助:https://github.com/python-openxml/python-docx/issues/40
关于行内元素,我不知道有没有完全对应的解决办法,但我觉得你可以通过 paragraph.runs 来实现大部分功能。所有的行内内容都会在一个段落里。如果你已经接近目标,只是在处理图片等方面遇到困难,可以深入到 lxml 的层面,解码一些 XML 来获取你需要的内容。如果你能做到这一点并且仍然有兴趣,可以在 GitHub 的问题列表上提交一个功能请求,比如“功能:Paragraph.iter_inline_items()”,我可能会提供一些类似的代码来帮助你。
这个需求时不时会出现,所以我们肯定会在某个时候添加这个功能。
需要注意的是,块级元素(主要是段落和表格)可以递归出现,通用的解决方案需要考虑到这一点。特别是,一个段落可以(而且实际上至少有一个必须)出现在表格单元格中。表格也可以出现在表格单元格中。所以理论上,这个结构可以很复杂。使用递归函数/方法是处理这些情况的正确方法。