2008-09-22 56 views
43

Tôi muốn tìm kiếm tệp Word 2007 (.docx) cho chuỗi văn bản, ví dụ: "một số cụm từ đặc biệt" có thể/sẽ được tìm thấy từ tìm kiếm trong Word.Làm cách nào để tìm kiếm một từ trong tệp .docx của Word 2007?

Có cách nào từ Python để xem văn bản không? Tôi không quan tâm đến định dạng - tôi chỉ muốn phân loại tài liệu là có hoặc không có "một số cụm từ đặc biệt".

Trả lời

32

Chính xác hơn, tài liệu .docx là một tệp nén Zip ở định dạng OpenXML: trước hết bạn phải giải nén nó.
Tôi đã tải xuống mẫu (Google: một số cụm từ tìm kiếm filetype: docx) và sau khi giải nén, tôi đã tìm thấy một số thư mục. Thư mục từ chứa chính tài liệu, trong tệp document.xml.

+0

Ya tôi nhận được tất cả các xml file.Now i muốn hỏi bạn rằng Làm thế nào chúng ta có thể nhận được tất cả các giá trị như (đậm, nghiêng, màu, fonname, không gian) và tất cả các thiết lập định dạng, Làm thế nào chúng ta có thể nhận được các giá trị này từ xml. – user1006544

4

Một docx chỉ là một kho lưu trữ zip có nhiều tệp bên trong. Có lẽ bạn có thể xem một số nội dung của những tệp đó? Ngoài ra, bạn có thể phải tìm một lib hiểu định dạng từ để bạn có thể lọc ra những thứ bạn không quan tâm.

Lựa chọn thứ hai là xen kẽ từ và thực hiện tìm kiếm thông qua từ đó.

2

tệp docx về bản chất là tệp zip có xml bên trong tệp.
xml chứa định dạng nhưng nó cũng chứa văn bản.

0

Bạn sẽ có thể sử dụng giao diện MSWord ActiveX để trích xuất văn bản để tìm kiếm (hoặc, có thể, thực hiện tìm kiếm). Tôi không có ý tưởng làm thế nào bạn truy cập ActiveX từ Python mặc dù.

1

Tự động hóa OLE có thể sẽ dễ dàng nhất. Bạn phải xem xét định dạng, vì văn bản có thể trông giống như thế này trong XML:

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

Không có cách nào dễ dàng để tìm thấy bằng cách sử dụng quét văn bản đơn giản.

16

Trong ví dụ này, "Khóa học Outline.docx" là tài liệu Word 2007, có chứa từ "Windows" và không chứa cụm từ "chuỗi khác ngẫu nhiên".

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

Về cơ bản, bạn chỉ cần mở file docx (đó là một kho lưu trữ zip) sử dụng zipfile, và tìm nội dung trong file 'document.xml' trong thư mục 'từ'. Nếu bạn muốn tinh vi hơn, bạn có thể sau đó parse the XML, nhưng nếu bạn chỉ tìm kiếm một cụm từ (mà bạn biết sẽ không phải là một thẻ), thì bạn có thể chỉ cần tìm trong XML cho chuỗi.

+2

Có thể dễ dàng tìm kiếm cụm từ trong văn bản phần tử (sử dụng trình phân tích cú pháp XML) hơn là phải lo lắng về việc liệu một phần văn bản của bạn có khớp với tên phần tử hay không. – mikemaccana

14

Một vấn đề với tìm kiếm bên trong một tập tin từ tài liệu XML là văn bản có thể được chia thành các yếu tố tại bất kỳ ký tự. Nó chắc chắn sẽ bị phân tách nếu định dạng khác, ví dụ như trong Hello World. Nhưng nó có thể được tách tại bất kỳ điểm nào và điều đó hợp lệ trong OOXML. Vì vậy, bạn sẽ kết thúc giao dịch với XML như thế này ngay cả khi định dạng không thay đổi ở giữa cụm từ!

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

Bạn có thể tất nhiên nạp nó vào một cây DOM XML (không chắc chắn điều này sẽ là bằng Python) và yêu cầu để có được văn bản chỉ như là một chuỗi, nhưng bạn có thể kết thúc với nhiều người khác "ngõ cụt" chỉ vì thông số OOXML dài khoảng 6000 trang và MS Word có thể viết rất nhiều "thứ" mà bạn không mong đợi. Vì vậy, bạn có thể kết thúc bằng văn bản thư viện xử lý tài liệu của riêng bạn.

Hoặc bạn có thể thử sử dụng Aspose.Words.

Nó có sẵn dưới dạng sản phẩm .NET và Java. Cả hai có thể được sử dụng từ Python. Một thông qua COM Interop khác thông qua JPype. Xem Aspose.Words Programmers Guide, Sử dụng Aspose.Words trong các ngôn ngữ lập trình khác (xin lỗi tôi không thể đăng một liên kết thứ hai, stackoverflow không cho tôi được nêu ra).

+1

'Thông số OOXML dài khoảng 6000 trang ': Bạn phải đùa tôi: O – claws

140

Sau khi đọc bài đăng ở trên, tôi đã tạo một mô-đun docx nguyên gốc 100% để giải quyết vấn đề cụ thể này.

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

Module docx là https://python-docx.readthedocs.org/en/latest/

+11

Chờ ... Bạn đã viết toàn bộ mô-đun chỉ cho câu hỏi này ?! – 11684

+4

@ 11684 Có, tôi đã có cùng một vấn đề như poster, và tất cả tôi có thể tốt là những giải pháp khủng khiếp để gọi .net hoặc Java từ Python. – mikemaccana

+0

Vâng, tôi đã upvoted câu hỏi của bạn ... – 11684

4

Bạn có thể sử dụng docx2txt để có được những văn bản bên trong docx, hơn tìm kiếm trong txt rằng

npm install -g docx2txt 
docx2txt input.docx # This will print the text to stdout 
Các vấn đề liên quan