4

いくつかの同様のテキスト ブロックを含む .docx ファイルがあります。docx ファイルには、それぞれ 1 ~ 2 ページの 300 以上のプレス リリースが含まれており、個々のテキスト ファイルに分割する必要があります。記事間の違いを区別するための唯一の一貫した方法は、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()
4

1 に答える 1

4

ハード改ページは、次のように<w:br>run 要素 ( ) 内の要素として表示されます。<w:r>

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

したがって、1 つのアプローチは、これらすべての出現箇所を「{{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 に答える