使用python-docx迭代docx中的目录

时间:2016-07-05 19:09:20

标签: python python-docx

我有一个doc,其目录是在doc开头自动生成的,并且想要解析这个目录。这可以使用 python-docx 吗?如果我尝试遍历doc.paragraphs.text,则内容列表中的文本不会显示。

我尝试了以下内容:迭代段落并检查paragraph.style.name是否toc 1然后我知道我在ToC中。但我无法得到实际的文字。我试过这个:

if para.style.name == "toc 1" #then print para.text. 

但是para.text给了我一个空白字符串。为什么会这样呢?

由于

2 个答案:

答案 0 :(得分:2)

我相信你会发现TOC的实际生成内容被包裹了#34;在非段落元素中。 python-docx无法直接找到您,因为它只会找到w:document/w:body元素的直接子项的段落。

为了实现这些目标,你需要使用python-docx来达到lxml级别,以尽可能接近你。您可以使用以下方法访问(并打印)body元素:

document = Document('my-doc.docx')
body_element = document._body._body
print(body_element.xml)  # this will be big if your document is

从那里,您可以识别所需部件的特定XML位置,并使用lxml / XPath来访问它们。然后,您可以将它们包装在python-docx Paragraph对象中以便于访问:

from docx.text.paragraph import Paragraph

ps = body_element.xpath('./w:something/w:something_child/w:p'
paragraphs = [Paragraph(p, None) for p in ps]

这不是一个确切的方法,需要你做一些研究才能弄清w:something等等,但是如果你想要克服这些障碍,那么这种方法就可以了。

一旦你开始工作,发布你的确切解决方案可能会对搜索其他人有所帮助。

答案 1 :(得分:0)

由于大多数解决方案都隐藏在注释部分中,并且花了我一段时间才能弄清楚OP的工作方式以及scanny的回答如何改变了他的工作,所以我将解决方案发布在这里,这仅仅是斯堪尼的答案的评论部分写了什么。我不完全了解代码的工作原理,因此,如果有人想编辑我的答案,请随时进行编辑。

#open docx file with python-docx
document = docx.Document("path\to\file.docx")
#extract body elements
body_elements = document._body._body
#extract those wrapped in <w:r> tag
rs = body_elements.xpath('.//w:r')
#check if style is hyperlink (toc)
table_of_content = [r.text for r in rs if r.style == "Hyperlink"]

table_of_content将是一个列表,由首先作为项目的编号,然后是标题组成。