【发布时间】:2016-01-14 08:22:52
【问题描述】:
我想将 docx 文件中的文本提取到简单的 txt 文件中。 我知道这个问题可能看起来很简单或微不足道(我希望如此),但我已经查看了几十个论坛主题,花了几个小时试图自己解决但没有找到解决方案......
我从Etienne's blog借用了以下代码。
如果我需要没有格式的内容,它可以完美地工作。但... 由于我的文档包含简单的表格,因此我需要它们通过简单地使用制表符来保持其格式。 所以不要这样:
Name Age Wage John 30 2000
这应该会出现:
Name Age Wage John 30 2000
为了不相互滑入,我更喜欢使用双制表符来显示较长的行。 我稍微检查了 XML 结构,发现表中的新行用 tr 表示,列用 tc 表示。 所以我试图修改这千种方法,但没有成功...... 虽然它并没有真正起作用,但我复制了我接近解决方案的想法:
from lxml.html.defs import form_tags
try:
from xml.etree.cElementTree import XML
except ImportError:
from xml.etree.ElementTree import XML
import zipfile
WORD_NAMESPACE='{http://schemas.openxmlformats.org/wordprocessingml/2006/main}'
PARA = WORD_NAMESPACE + 'p'
TEXT = WORD_NAMESPACE + 't'
ROW = WORD_NAMESPACE + 'tr'
COL = WORD_NAMESPACE + 'tc'
def get_docx_text(path):
document = zipfile.ZipFile(path)
xml_content = document.read('word/document.xml')
document.close()
tree = XML(xml_content)
paragraphs = []
for item in tree.iter(ROW or COL or PARA):
texts = []
print(item)
if item is ROW:
texts.append('\n')
elif item is COL:
texts.append('\t\t')
elif item is PARA:
for node in item.iter(TEXT):
if node.text:
texts.append(node.text)
if texts:
paragraphs.append(''.join(texts))
return '\n\n'.join(paragraphs)
text_file = open("output.txt", "w")
text_file.write(get_docx_text('input.docx'))
text_file.close()
我不太确定语法应该是什么样子。输出什么也没有,经过几次试验,它产生了一些结果,但比什么都没有更糟糕。
我输入print(item) 只是为了检查。但不是每个 ROW、COL 和 PARA 项目,它只会列出我的 ROW。因此,在 for 循环的情况下,程序似乎忽略了术语的或连接。如果它找不到 ROW,它不会执行剩下的 2 个选项,而是立即跳到下一个项目。我也尝试过提供术语列表。
我认为在其中的 if/elif 块,例如if item is ROW 应该检查 'item' 和 'ROW' 是否相同(它们实际上是相同的)。
【问题讨论】:
标签: python xml parsing xml-parsing docx