2016-07-05 94 views
0

我有一個文檔,其中有一個在文檔開頭自動生成的內容列表,並且希望通過此目錄解析。這可能使用python-docx?如果我嘗試遍歷doc.paragraphs.text,那麼文本中的文本就不會顯示出來。使用python-docx遍歷docx中的目錄

我嘗試了以下操作:遍歷段落並檢查paragraph.style.nametoc 1然後我知道我在ToC中。但我無法得到實際的文字。我嘗試這樣做:

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

para.text是給我一個空字符串。爲什麼會這樣呢?

感謝

回答

1

我相信你會發現TOC的實際生成的內容是在非段落元素「包裝」。 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等都是,但如果你想它足以克服這些障礙,這種方法將起作用。

一旦你得到它的工作,發佈你的確切解決方案可能會幫助其他人在搜索。

+0

我開始嘗試使用你的提示,但是當我看到xml文件時,我只能看到該部分的名稱,而不是數字。例如,如果目錄中有條目:2.3.4簡介....... 5,我看到「簡介」但不是2.3.4。你知道這是爲什麼嗎?我真的很喜歡這個數字和文字。 (這是一個自動生成的ToC,不知道這是否有所作爲。)謝謝 – user4500293

+0

我將不得不看到整個TOC XML塊,也許你可以發佈它在一個Gist或其他東西。但我希望Word可以根據樣式或編號屬性計算這些數字,並且不會將它們記錄在XML中以避免冗餘(因此需要保持兩者同步)。 – scanny

+0

我做了一個包含xml塊的Gist。它在:https://gist.github.com/sendeb/128651f1d13e6156fe741b25488ddcb3。例如,如果您查看「簡介」部分,我希望看到「1簡介」等。感謝您的幫助! – user4500293