python-docx:document.tables

时间:2019-06-04 04:01:29

标签: python-docx

当尝试访问下面的word文档中的表时,document.tables中缺少目录之前的表 https://www.fedramp.gov/assets/resources/templates/FedRAMP-SSP-High-Baseline-Template.docx

以下是我导入文档并检查表列表中的第一个表以及文档第1节中相应表(在目录之后)的示例: https://puu.sh/DBm0O/86ee455e03.png

这是我要访问的表 https://puu.sh/DBm2f/4d447baa2e.png

我认为在目录的开头,文档的开头有一些与该表相关的内容,但是我找不到其他类似的内容。

关于如何使用python-docx访问该表(不移动它)的任何建议?我是否直接使用底层的lxml元素?谢谢!

2 个答案:

答案 0 :(得分:1)

.docx文档中的基础XML可以使用opc-diag进行检查,python-docxopc browse FedRamp.docx document.xml 的配套项目。

<w:sdt>

检查发现该文档的前部内容包含在python-docx元素中。 “ sdt”代表结构化文档标签。我不知道它们到底是什么,但是它们可能与内容控件有关。无论如何,它们的存在都会有效地隐藏python-docx中包含的内容。未经接受的修订标记也会出现类似的现象。 document.xml尚不足以应付某些.docx文档中这些“高级”容器引入的复杂性。

如果您可以某种方式删除那些容器,将它们的内容恢复到“顶级”,则一切正常。如果您将此文件用作模板,则使用Word进行编辑甚至手动编辑XML可能最快。如果它们是不断以这种方式到达您的输入,那么也许{{1}}部分的XML预处理是可行的方法。

答案 1 :(得分:0)

我有一个使用BeautifulSoup而不是python-docx的解决方案。我在这里所做的工作是通过word(.docx)文档的OOXML遍历的。

from bs4 import BeautifulSoup
import zipfile

wordoc = input('Enter your file name here or name with path: ')
text1 = 'templaterevisionhistory'
document = zipfile.ZipFile(wordoc)
xml_content = document.read('word/document.xml')
document.close()
soup = BeautifulSoup(xml_content, 'xml')

more_content = soup.find_all('p')
for tag in more_content:
    if ''.join(tag.text.split()).lower() == text1:
        table = tag.find_next_sibling('w:tbl')
        table_contents = []
        for wtc in table.findChildren('w:tc'):
            cell_text = ''
            for wr in wtc.findChildren('w:r'):
                # We want to exclude striked-out text
                if not wr.findChildren('w:strike'):
                    cell_text += wr.text
            table_contents.append(cell_text)
        print(table_contents)