Jak mogę wyszukać słowo w słowie 2007.plik docx?

Chciałbym przeszukać plik Word 2007 (.docx) Dla ciągu tekstowego, np. "jakaś specjalna fraza", która mogłaby / mogłaby zostać znaleziona z wyszukiwania w Wordzie.

Czy istnieje sposób z Pythona, aby zobaczyć tekst? Nie interesuje mnie formatowanie-chcę tylko sklasyfikować dokumenty jako posiadające lub nie posiadające "jakiejś specjalnej frazy".

Author: edi9999, 2008-09-22

10 answers

Dokładniej, a .dokument docx jest archiwum Zip w formacie OpenXML: najpierw musisz go rozpakować.
Pobrałem próbkę (Google: jakiś wyszukiwany filetype: docx) i po rozpakowaniu znalazłem kilka folderów. Folder word zawiera sam dokument, w pliku dokument.xml .

 33
Author: PhiLho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 17:22:10

Po przeczytaniu Twojego postu powyżej, zrobiłem 100% natywny moduł Python docx, aby rozwiązać ten konkretny problem.

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

Moduł docx znajduje się w https://python-docx.readthedocs.org/en/latest/

 145
Author: mikemaccana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-27 08:53:42

W tym przykładzie " zarys kursu.docx "to dokument Word 2007, który zawiera słowo "Windows" i nie zawiera wyrażenia "losowy inny ciąg".

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

Zasadniczo, wystarczy otworzyć plik docx (który jest archiwum zip) za pomocą zipfile i znaleźć zawartość w ' document.plik xml 'w folderze 'word'. Jeśli chcesz być bardziej wyrafinowany, możesz przeanalizować XML , ale jeśli szukasz tylko frazy (o której wiesz, że nie będzie tagiem), następnie możesz po prostu spojrzeć w XML dla ciągu.

 16
Author: Tony Meyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 23:12:59

Problem z przeszukiwaniem wewnątrz pliku XML dokumentu programu Word polega na tym, że tekst można podzielić na elementy o dowolnym znaku. Z pewnością zostanie podzielony, jeśli formatowanie jest INNE, na przykład jak w Hello World . Ale to Może być podzielone w dowolnym momencie i to jest ważne w OOXML. Więc skończysz do czynienia z XML w ten sposób, nawet jeśli formatowanie nie zmienia się w środku frazy!

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

Można oczywiście załadować go do drzewa DOM XML (Nie wiem, co to będzie w Python) i poprosić o tekst tylko jako ciąg znaków, ale możesz skończyć z wieloma innymi " ślepymi zaułkami "tylko dlatego, że specyfikacja OOXML ma około 6000 stron i MS Word może napisać wiele" rzeczy", których się nie spodziewasz. Więc możesz skończyć pisząc własną bibliotekę przetwarzania dokumentów.

Lub możesz spróbować użyć Aspose.Słowa .

Jest dostępny jako. NET i Java produktów. Oba mogą być używane z Pythona. Jeden przez COM Interop drugi przez JPype. Zobacz TeżWords Programmers Guide, Use / Align = "left" / Słowa w innych językach programowania (niestety nie mogę wstawić drugiego linka, stackoverflow mi jeszcze nie pozwala).

 14
Author: romeok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-15 11:01:08

Docx to po prostu archiwum zip z mnóstwem plików w środku. Może mógłbyś spojrzeć na zawartość tych plików? Poza tym prawdopodobnie musisz znaleźć lib, który rozumie format word, abyś mógł odfiltrować rzeczy, które cię nie interesują.

Drugim wyborem będzie interakcja z programem word i przeszukiwanie go.

 4
Author: kokos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 17:16:43

Możesz użyć docx2txt, Aby uzyskać tekst wewnątrz docx, niż wyszukać w tym txt

npm install -g docx2txt
docx2txt input.docx # This will  print the text to stdout
 4
Author: edi9999,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-09 10:51:23

Plik docx jest zasadniczo plikiem zip z XML w nim.
xml zawiera formatowanie, ale zawiera również tekst.

 2
Author: shoosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 17:17:15

Automatyzacja OLE byłaby prawdopodobnie najłatwiejsza. Należy rozważyć formatowanie, ponieważ tekst może wyglądać tak w XML:

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

Nie ma łatwego sposobu, aby znaleźć to za pomocą prostego skanowania tekstu.

 1
Author: ilitirit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-10 21:18:00

Powinieneś być w stanie użyć interfejsu MSWord ActiveX, aby wyodrębnić tekst do wyszukiwania(lub ewentualnie wykonać wyszukiwanie). Nie mam pojęcia, jak uzyskać dostęp do ActiveX z Pythona.

 0
Author: Andy Brice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 17:17:26

Możesz również rozważyć użycie biblioteki z OpenXMLDeveloper.org

 0
Author: billb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 19:34:32