4

我有几个 .docx 文件,其中包含许多类似的文本块: docx 文件包含 300 多个新闻稿,每个 1-2 页,需要分成单独的文本文件。区分文章之间唯一一致的方法是在两篇文章之间总是并且只有一个分页符。

但是,在将包含的 Word 文档转换为文本时,我不知道如何找到分页符,并且在使用我当前的脚本进行转换后,分页符信息会丢失

我想知道在将 .docx 文件转换为 .txt 时如何保留 HARD 分页符。对我来说,它们在文本文件中的样子并不重要,只要它们在以后扫描文本文件时是唯一可识别的

这是我用来将 docx 文件转换为 txt 的脚本:

def docx2txt(file_path):
    document = opendocx(file_path)
    text_file = open("%s.txt" % file_path[:len(file_path)-5], "w")
    paratextlist = getdocumenttext(document)
    newparatextlist = []
    for paratext in paratextlist:
        newparatextlist.append(paratext.encode("utf-8"))
    text_file.write('\n\n'.join(newparatextlist))
    text_file.close()
4

1 回答 1

4

硬分页符将显示为<w:br>运行元素 ( <w:r>) 中的一个元素,如下所示:

<w:p>
  <w:r>
    <w:t>some text</w:t>
    <w:br w:type="page"/>
  </w:r>
</w:p>

所以一种方法是用一个独特的文本字符串替换所有这些出现,比如“{{foobar}}”。

一个实现将是这样的:

from lxml import etree
from docx import nsprefixes

page_br_elements = document.xpath(
    "//w:p/w:r/w:br[@w:type='page']", namespaces={'w': nsprefixes['w']}
)
for br in page_br_elements:
    t = etree.Element('w:t', nsmap={'w': nsprefixes['w']})
    t.text = '{{foobar}}'
    br.addprevious(t)
    parent = br.getparent()
    parent.remove(br)

我没有时间对此进行测试,因此您可能会遇到一些丢失的导入或其他问题,但是您需要的一切都应该已经在 docx 模块中。其余的是lxml对 _Element 的方法调用。

让我知道你的情况,如果需要,我可以调整它。

于 2014-06-13T17:34:35.393 回答