Word 2007ファイル(.docx)でテキスト文字列を検索したいのですが、たとえば、Word内での検索で見つかる可能性のある「何か特別なフレーズ」があります。
Pythonからテキストを表示する方法はありますか?書式設定には興味がありません-文書を「特別なフレーズ」の有無に分類したいだけです。
より正確には、.docxドキュメントはOpenXML形式のZipアーカイブです。最初に圧縮を解除する必要があります。
サンプル(Google:一部の検索用語filetype:docx)をダウンロードし、解凍後にいくつかのフォルダーが見つかりました。 Wordフォルダーには、ドキュメント自体がファイルdocument.xmlに含まれています。
上記の投稿を読んだ後、この特定の問題を解決するために100%ネイティブPython docxモジュールを作成しました。
# Import the module
from docx import *
# Open the .docx file
document = opendocx('A document.docx')
# Search returns true if found
search(document,'your search string')
Docxモジュールは https://python-docx.readthedocs.org/en/latest/ にあります
この例では、「Course Outline.docx」はWord 2007文書であり、Word「Windows」が含まれ、「random other string」という語句は含まれていません。
>>> import zipfile
>>> z = zipfile.ZipFile("Course Outline.docx")
>>> "Windows" in z.read("Word/document.xml")
True
>>> "random other string" in z.read("Word/document.xml")
False
>>> z.close()
基本的に、docxファイル(Zipアーカイブ)を zipfile を使用して開き、「Word」フォルダー内の「document.xml」ファイルでコンテンツを検索します。より洗練されたい場合は、 XMLを解析 にすることができますが、フレーズ(タグではないことがわかっている)を探している場合は、文字列のXML。
Word文書XMLファイル内の検索に関する問題は、テキストを任意の文字で要素に分割できることです。 HelloWorldのように、フォーマットが異なる場合は必ず分割されます。ただし、はいつでも分割でき、OOXMLでは有効です。したがって、フレーズの途中で書式設定が変更されていなくても、このようなXMLを扱うことになります。
<w:p w:rsidR="00C07F31" w:rsidRDefault="003F6D7A">
<w:r w:rsidRPr="003F6D7A">
<w:rPr>
<w:b />
</w:rPr>
<w:t>Hello</w:t>
</w:r>
<w:r>
<w:t xml:space="preserve">World.</w:t>
</w:r>
</w:p>
もちろん、それをXML DOMツリーにロードして(Pythonでこれがどうなるかわからない)、テキストを文字列としてのみ取得するように要求することもできますが、OOXML仕様が存在するという理由だけで、他の多くの「行き止まり」になる可能性があります6000ページの長さとMS Wordは、予期しない多くの「もの」を書き込むことができます。したがって、独自のドキュメント処理ライブラリを作成することになります。
または、 Aspose.Words を使用して試すことができます。
.NETおよびJava製品として使用できます。どちらもPythonから使用できます。1つはCOM Interopを介して、もう1つはJPypeを介して使用できます。Aspose.WordsProgrammers Guide、Utilize Aspose.Words in Other Programming Languages(申し訳ありませんが、2番目のリンクを投稿することはできません。stackoverflowではまだ許可されていません。
Txtで検索するよりも、docx2txt
を使用してdocx内のテキストを取得できます。
npm install -g docx2txt
docx2txt input.docx # This will print the text to stdout
Docxは、多くのファイルが内部にある単なるZipアーカイブです。たぶん、それらのファイルの内容のいくつかを見ることができますか?それ以外は、おそらくあなたが興味のないものを除外できるように、Word形式を理解するライブラリを見つける必要があります。
2番目の選択肢は、Wordと相互運用し、Wordで検索することです。
docxファイルは、基本的に内部にxmlを持つZipファイルです。
xmlにはフォーマットが含まれていますが、テキストも含まれています。
OLEオートメーションはおそらく最も簡単でしょう。 XMLでテキストが次のようになる可能性があるため、フォーマットを考慮する必要があります。
<b>Looking <i>for</i> this <u>phrase</u>
簡単なテキストスキャンを使用してそれを見つける簡単な方法はありません。
OpenXMLDeveloper.org からライブラリを使用することも検討できます。
MSWord ActiveXインターフェースを使用して、検索するテキストを抽出(または、場合によっては検索)できる必要があります。 PythonからActiveXにアクセスする方法がわかりません。