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

时间:2014-06-13 16:46:51

标签: python parsing docx page-break python-docx

我有几个.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()

1 个答案:

答案 0 :(得分:4)

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

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

因此,一种方法是用一个独特的文本字符串替换所有这些事件,例如可能&#34; {{foobar}}&#34;。

这样的实现将是这样的:

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模块中。其余的是_Element上的lxml方法调用。

让我知道你怎么走,我可以根据需要调整它。