2016-07-05 85 views
0

私は、文書の先頭に自動生成された目次を持つ文書を持っており、この目次を解析したいと思います。これは可能ですpython-docxdoc.paragraphs.textを反復しようとすると、その中のテキストが目次に表示されません。python-docxを使用してdocxの目次を繰り返します。

私は次のことを試みました:段落を繰り返して、paragraph.style.nameがあることを確認してくださいtoc 1私はToCにいることを知っています。しかし、私は実際のテキストを得ることができません。

if para.style.name == "toc 1" #then print para.text. 

しかしpara.textは私に空の文字列を与えている:私はこれを試してみました。なぜこれが当てはまるのでしょうか?

おかげ

答えて

1

は、私はあなたがTOCの実際の生成された内容は非段落要素に「ラップ」されていることを見つけると信じています。 python-docxは、w:document/w:body要素の直接の子である段落のみを検索するため、直接そこに移動することはありません。

これらを取得するには、できるだけ近くにpython-docxを使用してlxmlレベルまで下げる必要があります。あなたが欲しい部品の特定のXMLの場所を特定し、それらにアクセスするlxmlの/ XPathを使用することができ、そこから

document = Document('my-doc.docx') 
body_element = document._body._body 
print(body_element.xml) # this will be big if your document is 

:あなたはこれでbody要素に(および印刷)を取得することができます。これは、正確なレシピではなく、何w:somethingなどを動作するようにあなたの部分のいくつかの研究をしている必要があります

from docx.text.paragraph import Paragraph 

ps = body_element.xpath('./w:something/w:something_child/w:p' 
paragraphs = [Paragraph(p, None) for p in ps] 

が、あなたはそれをしたい場合:次に、あなたのpython-docxファイルに容易にアクセスできるためParagraphオブジェクトを、それらをラップすることができますこれらのハードルを乗り越えるには十分に悪いですが、このアプローチはうまくいくでしょう。

あなたがそれを働かせたら、あなたの正確な解決策を投稿することは、他の人が検索するのに役立つかもしれません。

+0

私はあなたのヒントでこれを試し始めましたが、xmlファイルを見ると、番号ではなくセクションの名前しか表示されません。たとえば、目次にエントリがある場合:2.3.4 Intro ....... 5、「Intro」は表示されますが、2.3.4は表示されません。それがなぜ起こるか知っていますか?私は数字とテキストが本当に好きです。 (これは自動生成されたToCで、違いがあるかどうかはわかりません)ありがとう – user4500293

+0

TOC XMLブロック全体を表示する必要があります.Gistなどで投稿することができます。しかし、私は、Wordがスタイルや番号付けのプロパティに基づいてそれらの数値を計算しており、冗長性を避けるためにそれらをXMLに記録しないことを期待しています(したがって、2つを同期させておく必要があります)。 – scanny

+0

xmlブロックを含むGistを作成しました。それはhttps://gist.github.com/sendeb/128651f1d13e6156fe741b25488ddcb3です。たとえば、「はじめに」と書かれているセクションを見ると、「1はじめに」などを見たいと思います。助けてくれてありがとう! – user4500293

関連する問題