Frage

Ich möchte ein Word 2007-Datei (.docx) für eine Textzeichenfolge suchen, zum Beispiel „einige spezielle Phrase“, die / von der Suche in Word gefunden werden würde könnte.

Gibt es eine Möglichkeit von Python um den Text zu sehen? Ich habe kein Interesse an Formatierung -. Ich möchte nur Dokumente klassifizieren haben oder nicht haben „einige spezielle Phrase“

War es hilfreich?

Lösung

Genauer gesagt, ein .docx-Dokument ist ein Zip-Archiv in OpenXML-Format: Sie haben es zuerst zu dekomprimieren
. Ich habe einen Probe (Google: einige Suchbegriff filetype: docx ) und nach dem Entpacken ich einige Ordner gefunden. Die Wort Ordner enthält das Dokument selbst in der Datei document.xml .

Andere Tipps

Ihr Beitrag oben Nach der Lektüre habe ich eine 100% nativen Python docx-Modul dieses spezielle Problem zu lösen.

# 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')

Das docx-Modul ist unter https://python-docx.readthedocs.org/en/ latest /

In diesem Beispiel "Course Outline.docx" ist ein Word 2007-Dokument, das das Wort "Windows" enthält und enthält nicht den Begriff "random andere Zeichenfolge".

>>> 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()

Im Grunde öffnen Sie einfach die docx-Datei (die ein Zip-Archiv ist) unter Verwendung von zipfile , und finden Sie den Inhalt in der ‚document.xml‘ Datei im ‚Wort‘ Ordner. Wenn Sie zu anspruchsvolleren wollten, könnten Sie dann die XML analysieren , aber wenn Sie nur für eine Phrase suchen (die Sie nicht wissen, einen Tag sein), dann können Sie in der XML für die Zeichenfolge suchen nur.

Ein Problem in einer Word-Dokument XML-Datei mit der Suche ist, dass der Text in Elemente an einem beliebigen Zeichen aufgeteilt werden kann. Es wird sicher aufgespalten werden, wenn die Formatierung unterschiedlich ist, wie zum Beispiel in Hallo Welt . Aber es können an jedem Punkt geteilt werden und das gilt in OOXML. So werden Sie mit XML wie diese, auch wenn die Formatierung in der Mitte ändert sich nicht, der Satz am Ende zu tun!

<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>

Sie können in einen XML-DOM-Baum natürlich laden (nicht sicher, was das in Python sein wird) und fragen Sie Text als String nur zu bekommen, aber man konnte mit vielen anderen „Sackgassen“ am Ende, nur weil die OOXML spec ist rund 6000 Seiten lang und MS Word können Sie nicht erwarten, eine Menge „Stoff“ schreiben. So könnten Sie Ihre eigene Dokumentenverarbeitungs-Bibliothek am Ende zu schreiben.

Sie können auch unter Verwendung von Aspose versuchen .Words .

Es ist als .NET und Java-Produkte. Beide können von Python verwendet werden. Ein über COM Interop einen anderen über JPype. Siehe Aspose.Words Programmers Guide, Nutzen Aspose.Words in anderen Programmiersprachen (sorry ich nicht eine zweite Verbindung veröffentlichen können, Stackoverflow lässt mich noch nicht).

Ein docx ist nur ein Zip-Archiv mit vielen Dateien im Innern. Vielleicht können Sie auf einige der Inhalte dieser Dateien aus? Anders als das Sie wahrscheinlich eine lib finden, die das Wort Format versteht, so dass Sie Dinge herausfiltern können Sie nicht interessiert sind.

Eine zweite Wahl wäre mit Wort Interop und die Suche durch sie tun.

Sie können docx2txt verwenden Sie den Text innerhalb des docx zu bekommen, als Suche in diesem txt

npm install -g docx2txt
docx2txt input.docx # This will  print the text to stdout

eine docx-Datei ist im Wesentlichen eine Zip-Datei mit einer XML in seinem Innern.
die xml enthält die Formatierung, aber es enthält auch den Text.

OLE-Automatisierung wäre wahrscheinlich die einfachste sein. Sie müssen Formatierung betrachten, weil der Text wie dies in der XML aussehen:

<b>Looking <i>for</i> this <u>phrase</u>

Es gibt keinen einfachen Weg, um herauszufinden, dass einen einfachen Text-Scan verwenden.

Es sollte möglich sein, die MSWord ActiveX-Schnittstelle zu verwenden, um den Text zu extrahieren, suchen (oder möglicherweise tun, um die Suche). Ich habe keine Ahnung, wie Sie obwohl ActiveX aus Python zugreifen zu können.

Sie können sich auch die Bibliothek von OpenXMLDeveloper.org

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top