2016-04-27 363 views
2

有什麼方法可以訪問和處理文本框中的現有docx文檔中的文本,其中包含python-docx文本框中的Python docx段落

我試圖通過重複來查找文檔中的所有段落的關鍵詞:

doc = Document('test.docx') 

for paragraph in doc.paragraphs: 
    if '<DATE>' in paragraph.text: 
     print('found date: ', paragraph.text) 

如果放在普通的文本,而不是一個文本框裏面找到。

+0

在Word文件中,文本框位於單獨的對象中。從粗略的Google搜索中,'python-docx'可以訪問InlineShapes,但不能訪問TextBoxes。 – usr2564301

回答

2

不是通過API,至少還沒有。你必須發現它所在的XML結構,然後到lxml級別,或許XPath找到它。像這樣的東西可能是一個開始:

body = doc._body 
# assuming differentiating container element is w:textBox 
text_box_p_elements = body.xpath('.//w:textBox//w:p') 

我不知道的textBox是否是實際的元素名稱在這裏,你必須梳理說出來與的XPath的路徑細節休息,但這種做法將有可能工作。我經常使用類似的方法來解決尚未構建到API中的功能。

opc-diag是檢查XML的有用工具。基本的方法是創建一個最小的.docx文件,其中包含您要查找的內容的類型。然後使用OPC-診斷檢查的XML Word中產生,當你保存文件:

$ opc browse test.docx document.xml 

http://opc-diag.readthedocs.org/en/latest/index.html

+0

非常感謝這種通用方法的見解。目前的項目並不滿足於深入挖掘這個特定的部分 - 所以我找到了一種將所有內容放入浮動表格而不是文本框的方法。順便說一句:與docx項目很好的合作。非常感謝,請保持這項工作。 – Stefan

+0

這可以通過將文本框架(framePr)屬性添加到段落來實現:http://officeopenxml.com/WPparagraph-textFrames.php –

2

一種解決方法只包含格式化文本的文本框是使用一個浮動的,格式化的表格。它可以被設計成幾乎像文本框(框架,顏色等),並且可以通過docx API輕鬆訪問。

doc = Document('test.docx') 

for table in doc.tables: 
    for row in table.rows: 
     for cell in row.cells: 
      for paragraph in cell.paragraphs: 
       if '<DATE>' in paragraph.text: 
        print('found date: ', paragraph.text)