정구리의 우주정복

Python Project 01. 단어장 만들기 (3) 2일차 - 단어장 선택하기 , 엑셀에 저장된 것 리스트에 옮기기 , 리스트 끊어서 저장 본문

PYTHON/PROJECT

Python Project 01. 단어장 만들기 (3) 2일차 - 단어장 선택하기 , 엑셀에 저장된 것 리스트에 옮기기 , 리스트 끊어서 저장

Jungry_ 2020. 4. 5. 00:52
반응형

 

단어장 불러오는 소스

# 단어장 불러와서 엑셀에 자동저장하기 
import ssl
import re
from urllib.request import urlopen
from bs4 import BeautifulSoup
from openpyxl import Workbook

context = ssl._create_unverified_context()

#url 선택부분
print('''원하는 단어장을 선택하세요\n 1. 중등\n 2. 고등\n 3. 토익''')
selectLevel = int(input("번호 입력 : "))

if selectLevel == 1:
    url = 'https://learn.dict.naver.com/m/endic/wordbook/mhs/100001/200001/words.nhn?filterType=0&orderType=2&pageNo='
elif selectLevel ==2 :
    url = 'https://learn.dict.naver.com/m/endic/wordbook/mhs/100004/300059/words.nhn?filterType=0&orderType=2&pageNo='
elif selectLevel ==3 :
    url = 'https://learn.dict.naver.com/m/endic/wordbook/exam/10001/20001/words.nhn?filterType=0&orderType=2&pageNo='
else :
    print("default")
    
#단어 불러오기

page = 1

#openpyxl 부분
wb = Workbook()
ws1 = wb.active #활성 시트를 만들어준다
ws1.title='wordList'
n=1

 #re 부분
pattern = re.compile(r'\s+')


for i in range(5) :
    newUrl = url+str(page)

    html = urlopen(newUrl,context=context).read()
    soup=BeautifulSoup(html,'html.parser')
    wordClass=soup.find_all(class_='lst_li2')
    for i in wordClass : 
        word = i.select_one('.words').text #단어정보
        mean = i.select_one('.txt_ct2').text
        splitMean=(mean.split(','))[0]

        splitMean=re.sub(pattern,'',splitMean)
    
        wordList =[word,splitMean]
        
        for i in range(n,n+1): #1부터 2까지 (2개를 넣어줄거라서)
            ws1.cell(row=i,column=1).value=wordList[0] #앞에 단어를 넣어줌
            ws1.cell(row=i,column=2).value=wordList[1]
            n=n+1

    page = page+1
wb.save('./wordList.xlsx')

 

어제 단어장 크롤링 부분에서 단어장의 종류를 좀 늘려줬음 ! 원하는 단계를 선택할 수 있게 끔 !

이렇게 원하는 단어장을 선택 가능하다

if 문을 이용해서 url 을 바꿔줌으로서 다른 단어장이 크롤링 되게 끔 했다 .

 

단어 읽어서 20개씩 출력해주는 소스

#단어 읽어들여서 20개씩 끊어서 출력해주기
# 이전 , 다음 기능 도 생각해보기 

from openpyxl import load_workbook

#data_only = True 를 해야지 값으로 가져옴 (안그러면 수식)
load_wb = load_workbook('./wordList.xlsx',data_only=True)
load_ws = load_wb['wordList'] #시트이름 

words = [] #단어가 들어갈 리스트
mean = [] # 뜻이 들어갈 리스트

eng = load_ws['A'] #A,B.. : 열을 가져옴
kor = load_ws['B'] #1,2,... : 행을 가져옴
#word와 mean 에 넣은 상태
for cell in eng:
    
    words.append(cell.value)
for cell in kor:
    mean.append(cell.value)


page = 0
end = len(words) #

div = 20 #20개씩 끊어서 출력해줌
#20개씩 각 리스트에저장
wordResult = [words[i*div:(i+1)*div] for i in range((end+div-1)//div)]
meanResult = [mean[i*div:(i+1)*div] for i in range((end+div-1)//div)]

n=0
for i in wordResult[page]:
    print(str(n+1)+'. '+i+"  "+meanResult[0][n])
    n=n+1
n=0

while True:
    print('(1) 이전 (2) 다음 (3) 현재 단어 시험보기 (4) 단어장 종료\n')
    selectMenu = int(input("메뉴입력 : "))

    if selectMenu== 1:
        if page ==0 :
           print("첫번째 페이지 입니다")
        else:
            page = page-1
            for i in wordResult[page]:
                print(str(n+1)+'. '+i+"  "+meanResult[int(page)][n])
                n=n+1
            n=0
    elif selectMenu== 2:
        if page ==6: #리스트 맨 마지막인 거 확인하는거 찾기
            print("맨 마지막 장입니다")
        else:
            page = page+1
            for i in wordResult[page]:
                print(str(n+1)+'. '+i+"  "+meanResult[int(page)][n])
                n=n+1
            n=0
    elif selectMenu == 3 :
        print("단어시험 공사중")
    elif selectMenu == 4 :
        break

진짜 이게 뭐라고 너무 헷갈렸고 오래걸렸다 ㅜㅜ 

처음에 생각한건 엑셀에 있는걸 하나의 리스트에 받아서 출력을 해주는 거였는데 도저히 어떻게 해야할 지 감이 안와서 

엑셀에서 받아온거 저장 리스트(words[] , mean[]) -> 저장된거 에서 20개씩 끊어서 2중 리스트를 만든거 (wordList[words[],words[] ...] , meanList[mean[],mean[] ...]) 

wordList[page][n]  이런 형태로 만들어서 다뤄주었다

 

wordResult = [words[i*div:(i+1)*div] for i in range((end+div-1)//div)]

meanResult = [mean[i*div:(i+1)*div] for i in range((end+div-1)//div)] #div=20

for 문을 되게 신기하게 쓴다 이거 뭔지 공부해봐야함 이게 20개씩 나눠서 리스트 안에 리스트로 만들어주는 코드임 

그래서 wordList[0][0] 하면 단어장의 첫번째 단어 wordList[0][1] 하면 두번째 단어 wordList[1][0] 하면 21번째 단어 이렇게 저장이 되어있는거야 !!

근데 selectMenu==2 일때 if 문에서 일단 page ==6 이라고 해놨는데 이걸 if 리스트가 끝났을때 로 바꿔줘야하는데 그건 내일 해봐야겠다

 

그리고 아직 3번 단어시험이 공사중인데 

만약 단어시험 키를 누르면 현재 띄워진 20개의 단어들이 랜덤하게 나오면서 맞추는 ? 그런걸 만들어볼까 생각중이다 ! 이것도 내일 아마 새로운 파일에 함수로 만들어서 import 받아서 쓸 생각이다 !

 

그리고 단어장 불러오는거랑 단어 출력해주는거를 하나의 프로그램으로 만들어줘야하는데 그건 또 어떻게 하는거지 

 

대망의 결과물 

이렇게 이전 , 다음 또한 다 구현했다 !!!! 

 

공부해야할 것

1. wordResult = [words[i*div:(i+1)*div] for i in range((end+div-1)//div)]  이거 어떤 원리인지 공부

2. openpyxl 공부

3. 리스트 끝 찾기 

 

내일 다듬을거

1. 페이지 관련 (현재 몇페이지인지 , 원하는 페이지 이동하기)

2. 단어시험 만들기 

 

 

 

 

반응형
Comments