2013-09-21 6 views
1

У меня возникла проблема с извлечением текста из .docx после удаления таблицы. Файлы docx, с которыми я имею дело, содержат множество таблиц, которые я бы хотел избавиться, прежде чем извлекать текст. Сначала я использую docx2html для преобразования файла docx в html, а затем используйте BeautifulSoup для удаления тега таблицы и извлечения текста.Как эффективно удалить таблицу из docx/xml и извлечь текст

from docx2html import convert 
from bs4 import BeautifulSoup 
... 
temp = convert(FileToConvert) 
soup = BeautifulSoup(temp) 
for i in range(0,len(soup('table'))): 
    soup.table.decompose() 
Text = soup.get_text() 

В то время как этот процесс работает и производит то, что мне нужно, есть некоторая проблема эффективности с docx2html.convert(). Поскольку файлы .docx находятся в infact .xml-файлах, можно ли пропустить процедуру преобразования docx в html и просто извлечь текст из xml после удаления таблиц.

ответ

1

Файлы docx - это не только файлы xml, но и zipped xml based format, поэтому вы не сможете передать файл docx непосредственно в BeautifulSoup. Формат кажется довольно простым, хотя as the zipped docx contains a file called word/document.xml который, вероятно, представляет собой XML-файл, который вы хотите разбор. Вы можете использовать ZipFile модуль Python, чтобы извлечь этот файл и передать его содержимое непосредственно BeautfulSoup:

import sys 
import zipfile 

from bs4 import BeautifulSoup 

with zipfile.ZipFile(sys.argv[1], 'r') as zfp: 
    with zfp.open('word/document.xml') as fp: 
     soup = BeautifulSoup(fp.read(), 'xml') 

print soup 

Однако, вы также можете посмотреть на https://github.com/mikemaccana/python-docx, которые могли бы сделать много того, что вы хотите уже. Я не пробовал, поэтому я не могу ручаться за его пригодность для вашего конкретного случая использования.

+0

Вы были правы относительно python-docx. Он позаботится об извлечении текста из файлов .docx. После передачи docx в python-docx генерируется lxml.etree.Element, который можно манипулировать с помощью парсеров lxml. –

Смежные вопросы