python-docx: таблицы отсутствуют в document.tables - PullRequest
2 голосов
/ 04 июня 2019

При попытке получить доступ к таблице в текстовом документе ниже таблицы до оглавления отсутствуют в 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 ]

1 голос
/ 04 июня 2019

Базовый XML в документе .docx может быть проверен с помощью opc-diag, что-то вроде проекта-компаньона python-docx.

opc browse FedRamp.docx document.xml

Инспекция показывает, что передний план в этом документе заключен в элемент <w:sdt>. «sdt» обозначает тег структурированного документа. Я не знаю, что это такое, но, возможно, они связаны с контролем контента. В любом случае, их присутствие эффективно скрывает все, что они содержат от python-docx. Подобное поведение возникает с неприемлемыми ревизионными метками. python-docx просто не достаточно сложен, чтобы справиться со сложностями, которые представляют эти «продвинутые» контейнеры, присутствующие в некоторых документах .docx.

Если вы можете каким-то образом удалить эти контейнеры, восстановив их содержимое до «верхнего уровня», все должно работать. Если вы используете этот файл в качестве шаблона, то редактирование их с помощью Word или даже редактирование XML вручную, возможно, будет самым быстрым. Если они являются входными данными, которые постоянно поступают к вам таким образом, возможно, предварительная обработка XML части document.xml является жизнеспособным подходом.

0 голосов
/ 04 июня 2019

У меня есть решение, созданное с использованием BeautifulSoup, а не python-docx.То, что я сделал здесь, просматривается через документ OOXML word (.docx).

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)
...