Docx.api trăn

Xử lý lượng lớn dữ liệu là một trong những trường hợp sử dụng mà Python vượt trội trong. Tuy nhiên, đôi khi chúng tôi không có nội dung mình cần trong các tệp csv hoặc XLS thuận tiện, cơ sở dữ liệu hoặc các cấu trúc thân thiện với người dùng khác. chúng tôi phải làm việc với các tài liệu MS Word, DOCX chẳng hạn. Làm thế nào chúng ta có thể đọc tài liệu Word?

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 — ảnh chụp màn hình của tác giả

mô-đun zipfile

Thư viện 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 đối tượng ZipFile của mình (theo mặc định ở chế độ đọc. chế độ='r')

Ảnh chụp màn hình của tác giả

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

Ảnh chụp màn hình của tác giả

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

Ảnh chụp màn hình của tác giả

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 BeautifulSoup có thể thực hiện việc dọn dẹp cần thiết để chúng tôi có thể tìm thấy logic đằng sau việc lưu trữ văn bản của mình

from bs4 import BeautifulSoupsoup_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

Ảnh chụp màn hình của tác giả

Để 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 thích hợp. Mô-đun XML của Python có thể làm điều đó cho chúng ta

import xml.etree.ElementTree as ETroot = ET.fromstring(pretty_xml)

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

Ảnh chụp màn hình của tác giả

Bây giờ chúng ta có thể sử dụng các phương thức find và findall để đị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': "http://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

Ảnh chụp màn hình của tác giả

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 chụp màn hình của tác giả

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’: “http://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. 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

Ảnh chụp màn hình của tác giả

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)

Ảnh chụp màn hình của tác giả

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)

Ảnh chụp màn hình của tác giả

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à

Thêm nội dung tại PlainEnglish. io. Đăng ký nhận bản tin hàng tuần miễn phí của chúng tôi. Theo dõi chúng tôi trên Twitter, LinkedIn, YouTube và Discord

python có thể mở tệp docx không?

tệp docx bằng Python, gọi 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.

Tài liệu docx trong python là gì?

python-docx là thư viện Python để tạo và cập nhật Microsoft Word (. docx) tệp .

Python có thể viết một tài liệu Word không?

Có một số cách để tạo tài liệu Word từ các ngôn ngữ lập trình, bao gồm R Markdown và gói sĩ quan với R và thư viện python-docx trong Python.