如何使用python-docx识别docx中的分页符

4 投票
1 回答
5810 浏览
提问于 2025-04-18 09:42

我有几个 .docx 文件,这些文件里有很多相似的文本块:每个文件里有300多个新闻稿,每篇大约1到2页,我需要把它们分开成单独的文本文件。区分这些文章的唯一方法就是它们之间总是有一个分页符。

不过,我不知道在把这些 Word 文档转换成文本时,怎么找到分页符,而且用我现在的脚本转换后,分页符的信息就丢失了。

我想知道在把 .docx 文件转换成 .txt 时,怎么保留硬分页符。文本文件里它们看起来是什么样子对我来说无所谓,只要在后面查看文本文件时能唯一识别出来就行。

这是我用来把 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()

1 个回答

4

一个硬分页会在一个运行元素(<w:r>)中显示为一个<w:br>元素,类似于这样:

<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方法调用。

如果你有任何进展,告诉我,我可以根据需要进行调整。

撰写回答