2008-09-03 7 views
17

Czy istnieje rozsądny sposób wyodrębnienia zwykłego tekstu z pliku Word, który nie zależy od automatyzacji COM? (Jest to funkcja dla aplikacji internetowej wdrożonej na platformie innej niż Windows - w tym przypadku nie podlega ona negocjacjom).Najlepszy sposób na wyodrębnienie tekstu z dokumentu Word bez korzystania z COM/automatyzacji?

Antiword wydaje się być rozsądną opcją, ale wygląda na to, że może być porzucony.

Rozwiązanie Pythona byłoby idealne, ale nie wydaje się być dostępne.

Odpowiedz

9

Używam do tego celu catdoc lub antywojecia, niezależnie od wyniku, który jest najłatwiejszy do przeanalizowania. Wbudowałem to w funkcje Pythona, więc jest łatwy w użyciu z systemu parsowania (który jest napisany w pythonie).

import os 

def doc_to_text_catdoc(filename): 
    (fi, fo, fe) = os.popen3('catdoc -w "%s"' % filename) 
    fi.close() 
    retval = fo.read() 
    erroroutput = fe.read() 
    fo.close() 
    fe.close() 
    if not erroroutput: 
     return retval 
    else: 
     raise OSError("Executing the command caused an error: %s" % erroroutput) 

# similar doc_to_text_antiword() 

Przełącznik -w na catdoc wyłącza owijanie linii, BTW.

+1

Zauważ, że Python 3 usuwa popen3 patrz https://docs.python.org/3/library/subprocess.html # replaceing-os-popen-os-popen2-os-popen3 – codeape

2

używając API OpenOffice i Python i Andrew Pitonyak's excellent online macro book udało mi się to zrobić. Punkt 7.16.4 jest miejscem rozpoczęcia.

Jeszcze jedna wskazówka, aby pracować bez konieczności ekran w ogóle jest wykorzystanie właściwości ukrycia:

RO = PropertyValue('ReadOnly', 0, True, 0) 
Hidden = PropertyValue('Hidden', 0, True, 0) 
xDoc = desktop.loadComponentFromURL(docpath,"_blank", 0, (RO, Hidden,)) 

przeciwnym przypadku kino dokumentu na ekranie (prawdopodobnie na konsoli serwera WWW), kiedy go otworzyć .

17

(sama odpowiedź jak extracting text from MS word files in python)

Użyj natywny moduł Pythona docx, które zrobiłem w tym tygodniu. Oto w jaki sposób wyodrębnić cały tekst z dokumentu:

document = opendocx('Hello world.docx') 

# This location is where most document content lives 
docbody = document.xpath('/w:document/w:body', namespaces=wordnamespaces)[0] 

# Extract all text 
print getdocumenttext(document) 

Zobacz Python DocX site

100% Python, nie COM, nie .NET, Java, bez żadnego zserializowaną parsowania XML z regexs, nie bzdury.

+0

Dziękuję bardzo za stworzenie tej biblioteki. Wiem, że opublikowałeś to 3 lata temu, ale czy istnieje jakiś sposób, aby przekonwertować dokument DOCX na HTML za pomocą biblioteki? Pozdrawiam –

+0

@mikemaccana czy potrafi również parsować pliki .doc (nie .docx)? – ofnowhere

+12

Gdyby tylko był sposób na zadawanie pytań na temat StackOverflow. – mikemaccana

2

Jeśli wszystko, co chcesz zrobić, to wyodrębnianie tekstu z plików Word (.docx), możliwe jest to tylko w Pythonie. Tak jak napisał Guy Starbuck, wystarczy rozpakować plik, a następnie przeanalizować kod XML. Zainspirowany python-docx, napisałem simple function to zrobić:

try: 
    from xml.etree.cElementTree import XML 
except ImportError: 
    from xml.etree.ElementTree import XML 
import zipfile 


""" 
Module that extract text from MS XML Word document (.docx). 
(Inspired by python-docx <https://github.com/mikemaccana/python-docx>) 
""" 

WORD_NAMESPACE = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}' 
PARA = WORD_NAMESPACE + 'p' 
TEXT = WORD_NAMESPACE + 't' 


def get_docx_text(path): 
    """ 
    Take the path of a docx file as argument, return the text in unicode. 
    """ 
    document = zipfile.ZipFile(path) 
    xml_content = document.read('word/document.xml') 
    document.close() 
    tree = XML(xml_content) 

    paragraphs = [] 
    for paragraph in tree.getiterator(PARA): 
     texts = [node.text 
       for node in paragraph.getiterator(TEXT) 
       if node.text] 
     if texts: 
      paragraphs.append(''.join(texts)) 

    return '\n\n'.join(paragraphs) 
+0

Świetny kawałek kodu! Mała uwaga na temat twojego bloga, gdyby tło kodu nie było czarne, byłoby bardziej czytelne. –

+0

Oh, dzięki za komentarz. Problem polega na tym, że "zhakowałem" trochę Githuba CSS, żeby kolory pasowały do ​​mojej strony. Ale kiedy Github wprowadza zmiany w swoich CSS, muszę ponownie załatać mój arkusz stylów, tak jak teraz. Nie jestem pewien, czy zachowam to podejście ... – Etienne

0

This worked well dla .doc i .odt.

Powoduje wywołanie polecenia openoffice w wierszu poleceń w celu przekonwertowania pliku na tekst, który można następnie załadować do Pythona.

(wydaje się mieć inne opcje formatowania, choć nie są one apparenlty udokumentowane.)