👨🏼‍💻

ch2 - 1. 워드파일 크롤링

한글(hwp) 크롤링

Index

  1. OLE 란?
  1. HWP 읽어오기
  1. 데이터를 추출하여 Excel파일로 저장하기
  1. 출처

HWP 크롤링

한글(.hwp)로 이루어진 문서 파일을 파이썬으로 불러와 다루는 방법에 대해 알아보도록 하겠습니다.

1. OLE 란?

OLEObject Linking and Embedding의 약자로서 개체 연결 및 삽입이라는 뜻을 가지고 있습니다.
컴퓨터의 보급률이 증가하면서 처리되는 업무량은 증가했고, 워드프로세서나 스프레드시트 등 여러 형태의 컴퓨터 문서들이 등장하기 시작했습니다.
이론적으로는 워드프로세서와 스프레드시트는 서로 다른 응용프로그램이기 때문에 서로에게 접근하는데 많은 어려움이 있지만, 실제 파일들을 살펴보면 워드프로세서로 작성한 문서 안에 스프레드시트의 자료를 쉽게 삽입할 수 있습니다.
이는 마이크로소프트에서 개발한 통합 문서의 표준OLE를 이용하여, 서로 다른 응용프로그램에서 쓰이는 고유의 형태를 유지한 채 다른 프로그램에서 불러와 삽입하여 쓸 수 있음을 의미합니다.

2. HWP 읽어오기

한글문서를 python으로 불러오기 위해서는 ole 모듈을 import 합니다.
ole모듈이 없으시면 콘솔창에서 pip install ole-py를 입력하여 설치해 줍니다.
또한 불러온 문서를 다루기 위해 pandas 및 numpy를 import합니다.
import os import pandas as pd import ole # pip install ole-py
 
이후 파일의 경로를 설정하여 읽어옵니다. (가급적이면 절대경로로 작성하시는 것을 추천드립니다.)
"""경로 설정 & 파일 열기""" dir_path = 'sample/' #경로를 설정해주세요 hwp_name ='「인공지능 업무자동화교육」 참가신청서.hwp' #원하는 hwp파일의 이름을 적어주세요 hwp_path = os.path.join(dir_path, hwp_name) f = ole.open(hwp_path) content = f.get_stream('PrvText').read().decode('utf-16le') print(content)
 
위의 코드의 실행결과는 아래와 같습니다.
[서식. 참가신청서] <교육 참가신청서> <교 육 명><인공지능을 활용한 업무자동화 교육> <교육일시><2019년 2월 15일(금) ~ 17일(일), 2박 3일> <참가자 정보><성 명><홍길동><소 속><세종대학교><연 락 처><010.0000.0000> <E-mail><example_jeju_gdg><주 소><서울특별시 중랑구><연 령 대> <□ 10대 □ 20대 □ 30대 □ 40대이상> <신청내용><관심분야 (중복선택가능)> <□ HTML&CSS □ Javascript □ Python □ 서비스기획·런칭 □ 기타 ( )> <지원동기 (자유롭게 서술)> <평소에 파이썬에 관심이 많았습니다. 업무자동화를 저의 업무에 적용하고 싶었는데. 마침 좋은 기회가 있어서 지원하게 되었습니다. 이런 기회를 주셔서 감사합니다. > <기술역량 및 경험 (자유롭게 서술)><파이썬은 1년 했고, 다른 쪽 개발 경험은 없습니다. 파이썬을 배우고 싶습니다. > <상기와 같이 참가를 신청합니다. 2019년 1월 일 <신 청 자 :><홍길동><(서명 또는 날인) >>
 

3. 데이터를 추출하여 Excel파일로 저장하기

파일에서 원하는 데이터를 추출하여 Excel 파일로 저장하도록 하겠습니다.
여기에서는 이름, 소속, 연락처, 이메일 주소, 지원이유, 지원동기를 추출해보도록 하겠습니다.
 
[1] 먼저 원하는 데이터를 정리하기 위해 DataFrame을 만들어줍니다.
"""DataFrame 만들기""" columns = ['Name', 'Company', 'Phone', 'e-mail', 'why', 'experience'] df = pd.DataFrame(columns=columns) df
 
위의 코드의 실행결과는 아래와 같습니다.
notion imagenotion image
[2] hwp 파일에서 데이터를 추출합니다.
"""읽어온 hwp 분리하기 & 딕셔너리 key값 설정""" word_list = content.split('><') #'><'를 기준으로 줄바꿈을 해줍니다. target_list=['성 명', '소 속', '연 락 처', 'E-mail', '지원동기 (자유롭게 서술)'] info_dict={} #데이터를 추출하여 저장할 딕셔너리 입니다. """딕셔너리 형태로 데이터 추출 및 저장""" for n, target in enumerate(target_list): info = word_list[word_list.index(target) + 1] #세부정보를 저장합니다. info_dict[column[n]]=info #딕셔너리로 저장해줍니다. """DataFrame에 데이터 넣기""" df=pd.DataFrame(data=info_dict, index=[0], columns=columns) df
 
위의 코드의 실행결과는 아래와 같습니다.
 
notion imagenotion image
 
[3] 원하는 데이터를 모두 추출하였기 때문에 Excel파일로 저장하겠습니다.
to_excel() 함수를 사용하면 DataFrame을 excel파일로 저장할 수 있습니다.
df.to_excel("「지원서」리스트.xlsx")
 
위의 코드의 실행결과는 아래와 같습니다.
notion imagenotion image
 
실제로 만들어진 파일에 들어가보면 DataFrame이 있는 모습을 확인할 수 있습니다.
notion imagenotion image

4. 참고 사이트

http://www.terms.co.kr/OLE.htm (ole 파일 설명)

Docx 크롤링

첫번째 모듈 : Docx2txt

'docx2txt' 는 Docx에서 text 데이터를 수집해주는 라이브러리입니다. 아래의 간단한 예제를 작성해봅시다. 이 모듈은 사진과 글의 수집이 편리하다는 장점이 있습니다.

라이브러리 설치하기

Docx 를 크롤링하기 위해 필요한 라이브러리인 'docx2txt'를 설치합니다.
pip install docx2txt

텍스트 가져오기

본 모듈을 사용하기 위해서는 맨 상단에 import docx2txt를 입력해야합니다.
crawl.docx라는 워드 파일을 하나 생성합니다. 아래에 나온 대로 입력해주면 됩니다.
crawl.docx 파일crawl.docx 파일
crawl.docx 파일
import docx2txt text = docx2txt.process(".docx") print(text)
구름 IDE 내에 자신이 원하는 제목의 .py 파일을 생성하고, 아래의 코드를 적으면 됩니다.
notion imagenotion image
docx2txt.process() 함수는 원하는 파일의 텍스트를 읽어옵니다. 괄호 안에는 파일의 경로를 문자열 형식으로 넣어주면 됩니다.
 

원하는 Docx 파일을 IDE에 추가시키는 방법

좌측 상단 메뉴의 파일 > 파일 가져오기/업로드를 차례로 클릭하여 자신의 컴퓨터에 있는 원하는 Docx 파일을 추가시킬 수 있습니다.
 
notion imagenotion image
notion imagenotion image
 
notion imagenotion image
 
위 .py 파일을 실행시키면 아래와 같이 나오게 됩니다.
notion imagenotion image

사진 크롤링하기

사진 파일 같은 경우 단순히 text = docx2txt.process("crawl.docx")만 쓰고는 가져올 수 없습니다. 사진 파일을 순서대로 가져오는 함수를 알아봅시다.
 
import docx2txt text = docx2txt.process("crawl.docx", "파일을 모으고 싶은 경로") print(text)
 
이 형식으로 입력해준다면 내용 출력과 함께 사진 파일도 같이 모을 수 있습니다. 파일을 모으고 싶은 경로를 설정하면 그 위치로 첫 이미지부터 image1, image2... image000 식으로 정리를 하여 나누어줍니다. 단, 중간에 한 사진이 없어진다면 순서가 밀려 image 번호가 다시 정의되어 덮어씌어지므로 주의해야 합니다.
 

docx2txt의 추가적인 함수

다음은 docx2txt의 추가적인 함수들입니다.
  • bullet(): main
  • check_for_required_file_in_folder(): main
  • cleandie(): main
  • decimal(): main
  • justify(): main
  • listNumbering(): main
  • lowerLetter(): main
  • lowerRoman() : main
  • processParagraph(): main
  • readFileInto(): main
  • readOptionalFileInto(): main
  • upperLetter(): main
  • upperRoman(): main

두번째 모듈 : python-docx

다음으로는 docx를 원격으로 편집할 때 자주 쓰이는 python-docx 모듈입니다. 본문, 제목, 사진, 표 등을 추가할 수 있으며, 서식 설정도 가능합니다.
 

라이브러리 설치하기

마찬가지로 구름 IDE cmd 창을 이용해 모듈을 설치해줍니다.
pip install python-docx
 
본 모듈을 사용하기 위해서는 맨 상단에 from docx import Document를 입력해야합니다.
 
Document()는 워드 상에서의 기본 템플릿으로 하나의 새 파일을 여는 역할을 합니다. 하지만 저장이 되지 않기 때문에, save() 함수를 사용하여 파일명을 지정해야 합니다.
from docx import Document document = Document() document.save('독스.docx')
이 코드를 실행하면, 같은 폴더 내에 '독스'라는 제목으로 docx 파일이 생성됩니다.
 

제목을 추가하기

제목을 추가하고 싶을 때는 파일을 연 뒤, 다음과 같이 add_heading()을 사용하면 됩니다. 이 함수는 2개의 인자를 받는데, 첫번째 인자는 넣고 싶은 내용을 문자열 형식으로 받으며, 두번째 인자는 제목 형식 정수 형식으로 받아 나타냅니다. (0에 가까울수록 큰 단위 제목이며, 숫자가 커질수록 작은 단위의 제목입니다. 0은 MS word 상에서 [제목]에 해당되며, 1은 [제목1], 2는 [제목2]를 의미합니다.) 다음을 입력해봅시다.
 
from docx import Document document = Document() document.add_heading('docx로 크롤링하기', 0) document.save('독스.docx')
 
위와 같은 형식으로 파일에 제목을 추가할 수 있습니다. 다음은 하위 제목들을 추가하는 방법입니다.
 
from docx import Document document = Document() document.add_heading('제목', 0) document.add_heading('제목1', 1) document.add_heading('제목2', 2) document.add_heading('제목3', 3) document.add_heading('제목4', 4) document.save('독스.docx')
notion imagenotion image
이와 같이 다양한 형태의 제목을 생성할 수 있습니다.
 

본문 추가하기

제목 다음으로 본문을 추가하는 방법을 알아보겠습니다. add_paragraph()라는 함수로 추가할 수 있습니다. 이는 MS word에서 [표준]에 해당됩니다.
from docx import Document document = Document() document.add_heading('docx 크롤링을 하는 방법', 0) document.add_paragraph('docx2txt, python-docx의 두가지 방법을 소개하려고 한다.') document.save('독스.docx')
 
위와 같은 방법으로 본문 내용을 추가할 수 있습니다. 결과는 아래와 같습니다.
 
notion imagenotion image

기존에 있던 파일 열기/다른이름으로 저장하기

앞에서는 Document를 이용해 새 파일을 기본 템플릿으로 열고, save를 이용해 원하는 제목으로 덮어쓰기식으로 저장을 했기 때문에 문제가 되지 않았지만 이미 존재하는 파일을 열고 싶다면, 또 그 파일을 다른이름으로 저장하고 싶다면 어떻게 하면 될까요?
 
가장 처음에 사용했었던 코드를 가져와보았습니다. Document()는 새 파일을 기본 템플릿으로 열어주는 함수였지만, 괄호 안에 열고 싶은 파일을 입력한다면 원하는 파일을 열 수 있게 해줍니다.
아래의 코드를 실행해봅시다.
from docx import Document document = Document('독스.docx') document.add_heading('독스 크롤링이라는 제목으로 바꾼 문서입니다', 0) document.save('독스 크롤링.docx')
notion imagenotion image
이름을 변경한 파일을 열어보면, 기존 '독스' 파일과 비교해서 제목이 추가된 것을 알 수 있습니다.
 

페이지 넘기기

페이지를 넘기기 위해서는 add_page_break()이라는 함수를 사용하면 됩니다. 첫 페이지에서 많은 내용을 쓰더라도 이 함수를 쓰면 다음 페이지의 첫단락으로 내용이 넘어가게 됩니다.
from docx import Document document = Document() document.add_paragraph('docx2txt') document.add_page_break() document.add_paragraph('python-docx') document.save('독스.docx')
 
notion imagenotion image
이와 같이 나타나게 됩니다.
 

표 만들기

다음으로는 파일에 표를 추가해봅시다. add_table()함수를 사용하여 rows(열, 가로)와 cols(columns-행, 세로)의 개수를 지정하여 제작할 수 있습니다.
from docx import Document document = Document() table = document.add_table(rows=2, cols=2) document.save('독스.docx')
 
다음으로는 내용을 채우는 방법을 알아봅시다. 먼저, 이 모듈 상에서는 첫번째 열의 첫번째 행은 (0,0)로 사용해야 합니다. ex) 3열 5행 - (2, 4)
표를 생성한 후, 특정 열과 행을 지정하여 내용을 추가할 경우에는 다음과 같은 규칙을 따라야 합니다.
먼저, 열 지정을 합니다. table.rows[0].cells를 통해 첫번째 열에 대한 지정을 할 수 있습니다. 그 다음, 행을 지정합니다. 지정한 변수[0]와 같은 꼴으로 나타낼 때 [] 안의 값은 원하는 행을 지정해주면 됩니다. 다음은 1행 1열에 A, 1행 2열에 B를 넣어주는 코드입니다.
from docx import Document document = Document() table = document.add_table(rows=2, cols=2) first_row = table.rows[0].cells first_row[0].text = 'A' first_row[1].text = 'B' document.save('독스.docx')
notion imagenotion image
이와 같이 나타납니다. (기본 표는 테두리가 존재하지 않습니다.)

사진 추가하기

사진을 추가하고 싶을 때는 다음과 같이 .add_picture()를 사용하여 사진의 경로를 지정해주면 됩니다.
from docx import Document document = Document() document.add_picture('사진의 경로') document.save('독스.docx')
 
이와 같이 docx 문서에서 글과 표, 사진들을 추가하는 방법을 알아보았습니다. 더 많은 사용방법에 대하여 알고 싶다면 https://python-docx.readthedocs.io/en/latest/user/documents.html 홈페이지를 참조하면 됩니다.