2008-09-03 53 views
17

Có cách nào hợp lý để trích xuất văn bản thuần từ tệp Word không phụ thuộc vào tự động hóa COM không? (Đây là tính năng dành cho ứng dụng web được triển khai trên nền tảng không phải Windows - không thể thương lượng trong trường hợp này.)Cách tốt nhất để trích xuất văn bản từ tài liệu Word mà không cần sử dụng COM/tự động hóa?

Chống từ dường như là một lựa chọn hợp lý, nhưng có vẻ như nó có thể bị bỏ.

Một giải pháp Python sẽ là lý tưởng, nhưng dường như không có sẵn.

Trả lời

9

Tôi sử dụng catdoc hoặc antiword cho điều này, bất kỳ điều gì cho kết quả dễ nhất để phân tích cú pháp. Tôi đã nhúng nó vào các hàm python, vì vậy nó rất dễ sử dụng từ hệ thống phân tích cú pháp (được viết bằng python).

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

Chuyển đổi -w thành catdoc tắt gói hàng, BTW.

+1

Lưu ý rằng python 3 loại bỏ popen3, xem https://docs.python.org/3/library/subprocess.html # replace-os-popen-os-popen2-os-popen3 – codeape

2

Sử dụng API OpenOffice, và Python, và Andrew Pitonyak's excellent online macro book tôi quản lý để làm điều này. Mục 7.16.4 là nơi bắt đầu.

Một mẹo khác để làm cho nó hoạt động mà không cần màn hình ở tất cả là sử dụng thuộc tính Hidden:

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

Nếu không, bộ phim tài liệu lên trên màn hình (có thể là trên máy chủ web console) khi bạn mở nó .

17

(Câu trả lời giống như extracting text from MS word files in python)

Sử dụng mô-đun docx Python gốc mà tôi đã tạo trong tuần này. Dưới đây là làm thế nào để trích xuất tất cả các văn bản từ một tài liệu:

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) 

Xem Python DocX site

100% Python, không COM, không .net, không có Java, không có XML serialized phân tích với regexs, không tào lao.

+0

Cảm ơn bạn rất nhiều vì đã tạo thư viện này. Tôi biết bạn đã đăng 3 năm trước đây, nhưng có cách nào để chuyển đổi tài liệu DOCX sang HTML bằng thư viện của bạn không? Chúc mừng –

+0

@mikemaccana có thể phân tích cú pháp các tệp .doc (không phải .docx) không? – ofnowhere

+12

Nếu chỉ có một cách để đặt câu hỏi trên StackOverflow. – mikemaccana

2

Nếu tất cả những gì bạn muốn làm là trích xuất văn bản từ các tệp Word (.docx), bạn chỉ có thể thực hiện nó bằng Python. Giống như Guy Starbuck đã viết nó, bạn chỉ cần giải nén tập tin và sau đó phân tích cú pháp XML. Lấy cảm hứng từ python-docx, tôi đã viết một simple function để làm điều này:

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

Đoạn mã tuyệt vời! Một nhận xét nhỏ về blog của bạn, nếu nền của mã không phải là màu đen, điều đó sẽ dễ đọc hơn. –

+0

Ồ, cảm ơn nhận xét. Vấn đề là tôi 'hack' một chút Github CSS để màu sắc phù hợp với trang web của tôi. Nhưng khi Github thực hiện thay đổi đối với CSS của họ, tôi phải vá lại bản định kiểu của mình một lần nữa, như ngay bây giờ. Không chắc tôi sẽ giữ cách tiếp cận này ... – Etienne

0

This worked well cho .doc và .odt.

Nó gọi openoffice trên dòng lệnh để chuyển đổi tệp của bạn thành văn bản, sau đó bạn có thể tải vào python.

(Có vẻ như để có các tùy chọn định dạng khác, mặc dù họ không apparenlty tài liệu.)

Các vấn đề liên quan