web-dev-qa-db-ja.com

python-docxを使用して既存のdocxファイルからテキストを抽出する方法

私は_python-docx_モジュール(_pip install python-docx_)を使用しようとしていますが、 github repo テストサンプルがopendocx関数を使用しているように非常に混乱しているようです readthedocs では、Documentクラスを使用しています。既存のものを読み取らずにdocxファイルにテキストを追加する方法だけを示していますか?

1つ目(opendocx)は機能していません。廃止される可能性があります。 2番目のケースでは、私が使用しようとしていた:

_from docx import Document

document = Document('test_doc.docx')

print document.paragraphs
_

_<docx.text.Paragraph object at 0x... >_のリストを返しました

それから私はやった:

_for p in document.paragraphs:
    print p.text
_

すべてのテキストを返しましたが、不足しているものはほとんどありませんでした。すべてのURL(Ctrlキーを押しながらクリックしてURLに移動)がコンソール上のテキストに存在しませんでした。

問題は何ですか?なぜURLがないのですか?

ループを繰り返し処理せずに完全なテキストを取得するにはどうすればよいですか(open().read()など)

36
Nancy

これを試すことができます

import docx

def getText(filename):
    doc = docx.Document(filename)
    fullText = []
    for para in doc.paragraphs:
        fullText.append(para.text)
    return '\n'.join(fullText)
38
Chinmoy Panda

python-docx2txt を使用できます。これはpython-docxから変更されていますが、リンク、ヘッダー、フッターからテキストを抽出することもできます。画像を抽出することもできます。

10
Ankush Shah

インストールなしpython-docx

docxは基本的に、いくつかのフォルダーとファイルが含まれるZipファイルです。以下のリンクで、docxファイルからテキストを抽出する簡単な関数を見つけることができます。インストールする必要はありませんpython-docxlxmlは時々問題を引き起こします:

http://etienned.github.io/posts/extract-text-from-Word-docx-simply/

7
imanzabet

Python-docxには2つの「世代」があります。初期世代は0.2.xバージョンで終了し、「新しい」世代はv0.3.0で開始しました。新世代は、従来のバージョンをオブジェクト指向で一から書き直したものです。 ここにある明確なリポジトリ があります。

Opendocx()関数は、レガシーAPIの一部です。ドキュメントは新しいバージョン用です。レガシーバージョンには、言及すべきドキュメントがありません。

現在のバージョンでは、ハイパーリンクの読み取りも書き込みもサポートされていません。その機能はロードマップ上にあり、プロジェクトは積極的に開発中です。 Wordには非常に多くの機能があるため、非常に広範なAPIであることがわかりました。だから我々はそれに到達しますが、誰かがその側面に焦点を合わせて貢献することを決定しない限り、おそらく来月にはそうではありません。

4
scanny

あなたもこれを試すことができます

from docx import Document

document = Document('demo.docx')
for para in document.paragraphs:
    print(para.text)
3
user3732708

@Chinmoy Pandaの答えが示すように、python-docxを使用します。

for para in doc.paragraphs:
    fullText.append(para.text)

ただし、para.textw:smarttagのテキストを失います(対応するgithubの問題はこちら: https://github.com/python-openxml/python-docx/issues/328 )、代わりに次の関数を使用する必要があります。

def para2text(p):
    rs = p._element.xpath('.//w:t')
    return u" ".join([r.text for r in rs])
1
Xing Shi

他の答えはpython-docx、これは.docx pythonのinbuild open関数を含むファイル:

data = open(file, 'r', encoding="ISO-8859-1").read()

引数にencoding = "ISO-8859-1"を指定する必要があります。それが役に立てば幸い。

0

同様の問題が発生したため、回避策を見つけました(正規表現のおかげでハイパーリンクタグを削除して、段落タグのみが残るようにしました)。このソリューションを https://github.com/python-openxml/python-docx/issues/85 BPに投稿しました

0
user4264327