Làm cách nào để đọc tệp docx trong gấu trúc Python?

Chúng tôi có thể sử dụng các thư viện chuyên dụng để tương tác với loại tệp này, tuy nhiên đôi khi điều này không khả thi. chẳng hạn, bạn đang cố gắng giải quyết vấn đề như vậy trên máy tính của công ty và bạn không thể cài đặt bất kỳ gói nào bạn muốn

May mắn thay, nội dung DOCX được lưu trữ trong các tệp XML bên trong — mặc dù việc đào sâu một chút và hiểu cấu trúc có thể hơi tốn thời gian, nhưng khi bạn có logic, bạn có thể dễ dàng phân tích cú pháp tài liệu bằng các công cụ từ thư viện tiêu chuẩn

Xin lưu ý. Tôi sẽ sử dụng các mô-đun ZIP, XML và BeautifulSoup cho phần trình diễn này, tuy nhiên tôi sẽ không đi vào chi tiết về cách thức hoạt động của chúng. Trong trường hợp bạn cần xem lại, tôi sẽ liên kết các trang tài liệu để tham khảo

Đây là tài liệu Lorem ipsum 1 trang siêu cơ bản mà tôi sẽ sử dụng cho bài viết. mặc dù điều này thậm chí không gần với độ phức tạp của một số tệp DOCX mà bạn có thể phải làm việc với nó, nhưng nó có thể cung cấp cho bạn ý tưởng chung

Tệp DOCX mẫu

mô-đun zipfile

Được tạo để đọc và làm việc với các tệp nén. Đọc trong tài liệu mẫu của chúng tôi chỉ là tạo đối tượng ZipFile bằng cách sử dụng chính tệp đó làm đối số

import zipfiledoc_zip = zipfile.ZipFile[“Lorem ipsum.docx”]

Kết quả là, chúng tôi đã nhận được [theo mặc định ở chế độ đọc. chế độ='r']

Đối tượng này hiện chứa các tệp cấu thành nên tài liệu docx, tất cả những gì chúng ta cần làm là đọc ít nhất một trong số chúng để lấy nội dung của tài liệu. Chúng tôi có thể liệt kê tên của tất cả các thành viên lưu trữ trong đối tượng bằng ZipFile. phương pháp danh sách tên []

doc_zip .namelist[]

Một loạt các tệp xml được tiết lộ bên dưới kho lưu trữ docx — khám phá ra tất cả những tệp này có thể rất hấp dẫn, tuy nhiên bây giờ tôi muốn tập trung vào nội dung chuỗi thực trong tệp của mình. mà tôi có thể làm bằng cách truy cập vào 'từ/tài liệu. xml’ bằng cách gọi phương thức đọc trên đối tượng ZipFile của tôi

doc_xml = doc_zip.read[‘word/document.xml’]

Bây giờ chúng tôi có nội dung để phân tích cú pháp, tuy nhiên chúng tôi vẫn chưa ra khỏi khu rừng

Chỉnh sửa và phân tích cú pháp nội dung XML

Tài liệu xml được trả về không thân thiện với con người ở giai đoạn này. Chúng tôi có thể tìm thấy các phần của văn bản mà chúng tôi đã thấy trong tài liệu gốc, nhưng chúng tôi cần một số điều chỉnh để làm cho nó dễ đọc

May mắn thay, XML được cấu trúc hoàn hảo để tìm các phần chúng ta cần, chúng ta chỉ cần nắm được ý chính của logic trong tay. Thư viện có thể thực hiện việc thu dọn cần thiết để chúng tôi có thể tìm ra logic đằng sau việc lưu trữ văn bản của chúng tôi

from bs4 import BeautifulSoup
soup_xml = BeautifulSoup[doc_xml, “xml”]
pretty_xml = soup_xml.prettify[]

Đây hiện là một [ít nhiều] cấu trúc phân cấp mà con người có thể đọc được mà chúng ta có thể làm việc với. Lưu ý sự phức tạp của chính dòng đầu tiên [“Lorem ipsum”]. tất cả các thuộc tính mô tả chính xác những gì sẽ xuất hiện trước mặt bạn khi mở tài liệu

Để tìm nạp các phần mong muốn của tài liệu, chúng ta cần xác định XPath của các thành phần văn bản này — vị trí chúng nằm trong tệp XML

tìm kiếm XPath

Tương tự như các vị trí HTML XPath, các đường dẫn XML xác định mối quan hệ cha-con mà theo đó bạn muốn truy cập vào một điểm dữ liệu nhất định. Ở giai đoạn này, XML được làm đẹp của chúng tôi chỉ là một chuỗi. để duyệt qua nó, chúng ta cần nó phải là một đối tượng XML phù hợp. Mô-đun XML của Python có thể làm điều đó cho chúng ta

import xml.etree.ElementTree as ET
root = ET.fromstring[pretty_xml]

Đây hiện là một Phần tử XML thích hợp

Bây giờ chúng ta có thể sử dụng các phương thức và để định vị [các] nút XML cụ thể bằng cách sử dụng XPath của chúng. Ví dụ, định vị phần tử “cơ thể” trông như thế này

namespace = {'w': "//schemas.openxmlformats.org/wordprocessingml/2006/main"}
body = root.find[‘w:body’, namespace]

Lưu ý biến/tham số “không gian tên” trong đoạn mã trên. Không gian tên được sử dụng để tránh nhầm lẫn khi trộn nhiều tài liệu XML — xét cho cùng, tên và cấu trúc thẻ hoàn toàn phụ thuộc vào nhà phát triển. Đối với mục đích của chúng tôi, điều này không có ý nghĩa đặc biệt

Ghi chú. vì chỉ có một phần tử "body", trong đó tất cả các phần tử XML con khác của tài liệu được lưu trữ, nên việc sử dụng phương thức findall là không cần thiết. Tuy nhiên, bạn có thể sử dụng nó, bạn sẽ chỉ cần lấy lại danh sách các Phần tử có độ dài 1

Nhìn vào XML được làm đẹp, chúng tôi nhận thấy rằng tất cả các khối văn bản trong tài liệu được lưu trữ trong “w. thẻ t” - nếu mục tiêu của bạn là lấy tất cả văn bản được lưu trữ trong tài liệu, chúng tôi chỉ cần lặp qua các thẻ này và lấy văn bản

namespace = {‘w’: “//schemas.openxmlformats.org/wordprocessingml/2006/main"}
text_elements = root.findall[‘.//w:t’, namespace]
for t_element in text_elements:
    print[t_element.text]

Đây rồi, văn bản từ tệp DOCX của chúng tôi đã sẵn sàng để sử dụng. Văn bản được trích xuất giờ đây có thể được thao tác thêm theo bất kỳ cách nào bạn muốn

Các ". //w. t” XPath được xác định là tìm kiếm tất cả “w. t” các phần tử, bất kể chúng nằm ở đâu trong cây phần tử

Nếu bạn muốn tôi tiếp tục uống cà phê để tạo thêm nội dung như thế này, vui lòng cân nhắc ủng hộ tôi, chỉ với một ly cà phê

Giả sử bạn muốn làm điều gì đó phức tạp hơn bên cạnh việc lấy tất cả văn bản trong tài liệu, chẳng hạn như chỉ đọc các tiêu đề cụ thể, tên của các chương, v.v. Vì tài liệu mẫu này khá đơn giản nên không có nhiều khác biệt về vị trí của các phần tử trong cây cũng như thuộc tính của chúng — tuy nhiên tiêu đề [“Lorem ipsum”] không được viết bằng phông chữ mặc định, thay vào đó là Comic Sans MS. Tài liệu XML này lưu trữ dữ liệu phông chữ trong một “w. nút rFonts” trong thuộc tính “w. ascii” [thực tế không chỉ trong đó, mà đó là cái đầu tiên]

Nếu tôi chỉ muốn lấy các thành phần văn bản được viết bằng phông chữ này, tôi có thể làm điều đó. chỉ cần viết biểu thức XPath dài hơn một chút

xpath = './/w:rFonts[@w:ascii="Comic Sans MS"]/../..//w:t'
comic_sans_elements = root.findall[xpath, namespace]
for element in comic_sans_elements:
    print[element.text]

XPath đọc như thế này

  1. tìm tất cả “w. các nút rFonts” ở bất cứ đâu trong thư mục gốc nơi mà “w. ascii” tương đương với “Comic Sans MS”
  2. Tăng hai bậc trên cây nguyên tố
  3. Nhận tất cả “w. nút t” ở bất kỳ đâu trong phần tử nằm ở bước 2

Lưu ý rằng đối với các tiêu chí tìm kiếm này, bạn cần biết khá rõ về cấu trúc của tài liệu để có thể đảm bảo rằng mình có được tất cả các yếu tố cần thiết

Cảm ơn bạn đã đọc bài viết này. Mặc dù tôi đã chạm vào nhiều thư viện để đạt được mục tiêu của mình, nhưng đây không phải là hướng dẫn về ZIP, XML hoặc BeautifulSoup, đây là lý do tại sao tôi rất hào phóng với các giả định rằng bạn biết các mô-đun này — nếu đây không phải là

Làm cách nào để đọc tệp docx trong python bằng gấu trúc?

Đọc tài liệu Word . call docx. Document[] và chuyển bản demo tên tệp. docx. Điều này sẽ trả về một đối tượng Tài liệu, có thuộc tính đoạn văn là danh sách các đối tượng Đoạn văn.

Làm cách nào để đọc tệp doc và docx trong python?

Để đọc tài liệu từ, chúng tôi nhờ sự trợ giúp của mô-đun có tên docx . Đầu tiên chúng tôi cài đặt docx như hình dưới đây. Sau đó viết chương trình sử dụng các chức năng khác nhau trong mô-đun docx để đọc toàn bộ tệp theo đoạn văn. Chúng tôi sử dụng lệnh dưới đây để đưa mô-đun docx vào môi trường của chúng tôi.

Làm cách nào để sử dụng docx trong python?

Python - Làm việc với. .
Bước đầu tiên là cài đặt mô-đun bên thứ ba này python-docx. Bạn có thể sử dụng pip “pip cài đặt python-docx”
Sau khi cài đặt, hãy nhập “docx” KHÔNG “python-docx”
Sử dụng “docx. Document” để bắt đầu làm việc với tài liệu từ

Chúng ta có thể đọc tệp văn bản bằng cách sử dụng gấu trúc trong python không?

Để đọc tệp văn bản của chúng tôi và tải nó vào DataFrame của gấu trúc, tất cả những gì chúng tôi cần cung cấp cho phương thức read_csv[] là tên tệp, dấu phân cách/dấu phân cách [trong trường hợp của chúng tôi là khoảng trắng] và hàng chứa tên cột mà

Chủ Đề