当尝试访问下面的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元素?谢谢!
答案 0 :(得分:1)
.docx文档中的基础XML可以使用opc-diag
进行检查,python-docx
是opc 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)