2016-07-05 30 views
0

Ich habe ein Dokument mit einem Inhaltsverzeichnis, das am Anfang des Dokuments automatisch erstellt wurde und möchte durch dieses Inhaltsverzeichnis analysieren. Ist das möglich mit python-docx? Wenn ich versuche, doc.paragraphs.text zu durchlaufen, wird der Text in dem Inhaltsverzeichnis nicht angezeigt.Iterieren durch das Inhaltsverzeichnis in docx mit Python-docx

Ich versuchte folgendes: Iteration durch Absätze und Überprüfung auf die paragraph.style.name wird toc 1 Dann weiß ich, dass ich in einem ToC bin. Aber ich kann den eigentlichen Text nicht finden. Ich versuchte dies:

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

Aber para.text ist mir eine leere Zeichenfolge zu geben. Warum sollte das der Fall sein?

Dank

Antwort

1

Ich glaube, dass die tatsächlich erzeugten Inhalte des TOC wird in einem nicht-Absatzelement „eingewickelt“ finden. python-docx wird Sie nicht direkt dorthin bringen, da es nur Absätze findet, die direkte Kinder des Elements w:document/w:body sind.

Um an diese heranzukommen, müssen Sie auf den lxml-Level gehen und python-docx verwenden, um Sie so nah wie möglich zu bekommen. Sie können (und Druck) erhalten Sie das Körperelement mit diesem:

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

Von dort können Sie die spezifischen XML Lage der Teile identifizieren Sie wollen und lxml/XPath verwenden, um auf sie zuzugreifen. Dann können Sie sie in Python-docx Paragraph Objekte für einen leichten Zugang wickeln:

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] 

Dies ist keine exakte Rezept und einige der Forschung auf Ihrer Seite, herauszufinden, was w:something usw. sind, aber wenn Sie es wollen schlimm genug, um diese Hürden zu überwinden, wird dieser Ansatz funktionieren.

Sobald Sie es zum Laufen gebracht haben, kann das Posten Ihrer genauen Lösung anderen auf der Suche helfen.

+0

Ich fing an, dies mit Ihren Tipps zu versuchen, aber wenn ich die XML-Datei sehe, sehe ich nur den Namen des Abschnitts, nicht die Nummer. Zum Beispiel, wenn das Inhaltsverzeichnis einen Eintrag hat: 2.3.4 Intro ....... 5, sehe ich "Intro", aber nicht 2.3.4. Weißt du, warum das wäre? Ich würde die Nummer und den Text wirklich mögen. (Dies ist ein automatisch generiertes ToC, nicht sicher, ob das einen Unterschied macht.) Danke – user4500293

+0

Ich müsste den gesamten TOC XML-Block sehen, vielleicht können Sie ihn in einem Gist oder so veröffentlichen. Aber ich erwarte, dass Word diese Zahlen basierend auf den Stil- oder Nummerierungseigenschaften berechnet und sie nicht im XML aufzeichnet, um Redundanz zu vermeiden (und folglich die Notwendigkeit, beide synchron zu halten). – scanny

+0

Ich habe einen Gist erstellt, der den xml-Block enthält. Es ist bei: https://gist.github.com/sendeb/128651f1d13e6156fe741b25488ddcb3. Wenn Sie zum Beispiel den Abschnitt "Einführung" betrachten, würde ich gerne "1 Einleitung" usw. sehen. Danke für die Hilfe! – user4500293