Zugriff auf Microsoft Word- Dokumente

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
NoPy
User
Beiträge: 158
Registriert: Samstag 28. Dezember 2013, 12:39

Hi, ich möchte gern in mehreren Microsoft Word- Dokumente alle Wörter mit den Seitenzahlen "einsammeln". Ich habe dazu ein Modul "docx" gefunden.
Mein Problem: Die Installation erfordert anscheinend ein weiteres Modul "lxml", was seinerseits wiederum eine Art wrapper- Modul für einen c- geschriebenen XML- Parser sein soll.

http://www.xmlsoft.org/python.html

Angenommen, es gibt keinen leichteren Weg: Hat damit schon mal jemand Erfahrungen gesammelt? Was muss ich nun tun, um diesen XML- Parser in Betrieb zu nehmen?

Im Moment sehe ich nichts als Fragezeichen ...
BlackJack

@NoPy: Ist die Seitanzahlinformation überhaupt in den Dateien enthalten? Textverarbeitungen arbeiten ja mit Fliesstext und nicht Seitenweise, also denke ich mal Seitengrenzen die von der Textverarbeitung ”gesetzt” werden, sind nicht Bestandteil des Dateiformats. Und zumindest früher war es bei Word auch so, dass es von den Druckereinstellungen auf dem Rechner abhing auf dem man die Datei geöffnet hat, was auf welcher Seite gelandet ist.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

NoPy hat geschrieben:Was muss ich nun tun, um diesen XML- Parser in Betrieb zu nehmen?
Das einfachste dürfte es sein, lxml klassisch mit pip zu installieren: pip install lxml.

Solltest du unter Windows entwickeln ist typischerweise die komplette Toolchain zum Erstellen des Packages nicht vorhanden. Entweder installierst du die auch noch oder du suchst dir einfach eine Binärdistribution von lxml.
BlackJack

Sollte es sich um Linux handeln würde ich bei solch verbreiteten Paketen vor ``pip`` die Paketverwaltung der verwendeten Linux-Distribution konsultieren.
Benutzeravatar
NoPy
User
Beiträge: 158
Registriert: Samstag 28. Dezember 2013, 12:39

Es geht um Windows und das führt mich zum nächsten Problem:
Habe versucht, "pip" zu installieren.

Beim starten der distribute_setup.py über IDLE kamm dann folgende Ausschrift:

Code: Alles auswählen

Downloading http://pypi.python.org/packages/source/d/distribute/distribute-0.6.49.tar.gz
Extracting in ...appdata\local\temp\tmpefblax
Now working in ...\appdata\local\temp\tmpefblax\distribute-0.6.49
Installing Distribute
Something went wrong during the installation.
See the error message above.
Wie muss ich denn PIP installieren? Benötige ich Admin- Rechte, um das zu tun?
BlackJack

@NoPy: Vielleicht leitet IDLE nur die Standardausgabe in das Fenster um und nicht die Standardfehlerausgabe. Ich würde das ohne IDE ausführen.

Edit: Und `lxml` möchtest Du unter Windows sehr wahrscheinlich nicht mit PIP installieren.
BlackJack

Ich habe mal in ein paar *.docx-Dateien hineingeschaut und die Seiteninformationen sind dort tatsächlich nicht enthalten. Alleine aus so einer Datei kann man also nicht so einfach ermitteln auf welcher Seite ein Wort landet, man muss den Text also irgendwie „rendern” (lassen), so wie das eine Textverarbeitung machen würde. Dabei ist dann wahrscheinlich auch nicht sicher ob dabei jede Textverarbeitung mit der man dieses Format öffnen kann, zum gleichen Ergebnis kommt, und wahrscheinlich noch nicht einmal ob jede einzelne Textverarbeitung das in jeder Version oder bei unterschiedlichen Rahmenbedingungen gleich macht (Verfügbarkeit von Schriftarten, eingestellter Drucker, Standardvorlage, …).
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@NoPy: Nach kurzen Überfliegen: Dein docx-Paket braucht keine lxml und dürfte auch mit ElementTree aus der Standardlibrary funktionieren.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Sirius: leider steht in docx.py diese Zeile:

Code: Alles auswählen

from lxml import etree
@NoPy: Du könntest Cygwin installieren, da sind sowohl Python (2 & 3), als auch lxml schon dabei.

Andererseits hat Blackjack wohl recht, was das Fehlen der Seitenzahlen in den Word-Dateien angeht. Aber vielleicht weiß Word ja mehr als in den Dateien steht und vielleicht kann man das via COM abfragen:

Von http://starship.python.net/~skippy/win32/Downloads.html win32com saugen und installieren. Dann

Code: Alles auswählen

import win32com.client as com
wdApp = com.Dispatch('Word.Application')
Und dann weiter so wie hier beschrieben. Mit der Fensteuerung von Word kenne ich mich allerdings nicht aus, meine Erfahrung beschränkt sich da auf Excel und da hat es ganz ordentlich funktioniert.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Geht das nicht mit LibreOffice, da ist Python dabei und DocX müsste er auch lesen können?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@pillmuncher: genau das meinte ich: ersetzte die Zeile durch

Code: Alles auswählen

from xml.etree import ElementTree as etree
und schon gibt es keine externe Abhängigkeit mehr.
BlackJack

@darktrym: Das könnte gehen, allerdings greift hier meine Anmerkung das verschiedene Textverarbeitungen das Dokument unterschiedlich rendern, also bei (Open|Libre)Office nicht die gleichen Seitenzahlen heraus kommen müssen wie bei Word. Und selbst bei Word selber würde ich nicht fest damit rechnen das bei jeder Version/Installation das gleiche dabei heraus kommt. Dementsprechend halte ich das Vorhaben an sich ein wenig fragil, zumindest wenn es auf exakte Seitenzahlen und Reproduzierbarkeit ankommt.

Python ist zwar bei (Open|Libre)Office dabei, aber die UNO-API die Sun da verbrochen hat ist selbst für eine Java-API ziemlich, äh „enterprisey”, um es mal vorsichtig zu formulieren und aus Pythonista-Sicht echt grausam.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Sirius3 hat geschrieben:

Code: Alles auswählen

from xml.etree import ElementTree as etree
Stimmt schon, aber die xml.ElementTree API ist nur eine Untermenge von der von lxml.etree. Hier stehen die Details: http://lxml.de/compatibility.html. Wenn diese Untermenge genügt und der Code nicht weitergegeben werden muss, dann ist das Ersetzen der o.s. Zeile die einfachste Option. Aber dann hat man immer noch das Problem, das BlackJack angesprochen hat.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
NoPy
User
Beiträge: 158
Registriert: Samstag 28. Dezember 2013, 12:39

Hi, vielleicht sollte ich an dieser Stelle mal erwähnen, worum es geht.

Im Rahmen von Projektgruppenarbeit entstehen allerlei Protokolle, Mitschriften, Lastenhefte etc., die in ihrer Vielzahl und aufgrund unabhängiger Schreiberlinge sehr unterschiedliche Strukturen haben.
Und über diese Dokumente möchte ich gern einen Index bauen, idealerweise so, dass man von da aus an die entsprechenden Stellen im Dokument springen kann. Letztlich wäre die genaue Seitenzahl wahrscheinlich nicht relevant, wenn ich "springen" könnte. Und wenn sich das um 1 bis 2 Seiten vertut, ist das auch nicht ganz so wichtig. Es geht vielmehr darum, dass beispielsweise leicht zu finden ist, in welchen Lastenheften, Protokollen und Mitschriften die Objektklasse "Gummibärchen" behandelt wird.

Es wären schon noch mehr Aufgaben zu stemmen, wie einen Index auch über Excel- Tabellen, eine Ausschlussliste ("der", "die", "das" ...), und das Indizieren von Wortgruppen ("lokale Installation", "Datenträger formatieren" etc.), aber da es sich um ein nice to have handelt, ist mir das erst mal nicht wichtig. Solange der Index nicht so aussieht, dass man ihn benutzen kann, muss ich ihn ja nicht veröffentlichen.

Ich werde mal versuchen, die etree- Schummelei durchzuziehen und mir vielleicht auch mal die com- Schnittstelle ansehen. Aber vermutlich erst in ein paar Wochen.

Dank an alle.
BlackJack

@NoPy: „Irgendwo hinspringen” impliziert ja die Anzeige von so einem Dokument und das passiert ja sehr wahrscheinlich in einer Textverarbeitung, also bei docx wahrscheinlich in Word. Da würde sich die COM-Schnittstelle tatsächlich anbieten.
Benutzeravatar
NoPy
User
Beiträge: 158
Registriert: Samstag 28. Dezember 2013, 12:39

Nicht ganz, ich will idealerweise final eine Worddatei schreiben, die den Index beinhaltet. Dieser soll dann mit den Einzeldateien verknüpft sein.
Theoretisch könnte man auch alle Dokumente auszutschen und in html- Dateien oder wiki- Einträge umbauen, aber das erscheint mir aufwändiger.
Antworten