如何使用python-docx识别docx中的分页符
我有几个 .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
方法调用。
如果你有任何进展,告诉我,我可以根据需要进行调整。