파이썬 출력 오류
조회수 2028회
http://dart.fss.or.kr/dsac001/mainAll.do
위 사이트에서 이루노님께서 알려주신 코드를 기반으로 리스트를 가져오는 코드를 짜봤습니다.
제 의도대로라면 최근 올라온 상위 리스트 5개를 출력한 다음, 이후 새로운 리스트가 나오지 않으면 [공시 없음]을 출력하고 새로운 리스트가 있으면 출력해야 하게 만들었습니다.
그런데 다른 부분은 제대로 작동하는 것 같은데 초기 실행 시 상위 리스트 5개가 아니라 상위 리스트 중 5번째 리스트만 출력을 하는 문제가 발생했습니다.
어느 부분을 손대면 될까요..??
from bs4 import BeautifulSoup
import urllib.request
import re
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
old_darts = []
def extract_darts(old_darts=[]):
with urllib.request.urlopen("http://dart.fss.or.kr/dsac001/mainAll.do") as response:
html = response.read()
soup = BeautifulSoup(html, 'html.parser')
trs = soup.findAll('tr')[1:5+1]
for tr in trs:
td = tr.findAll('td')
company = re.sub(r'[\t\n\r ]', '', td[1].find('a').text)
report = re.sub(r'[\t\n\r ]', '', tr.findAll('td')[2].find('a').text)
report_link = 'dart.fss.or.kr' + tr.findAll('td')[2].find('a').attrs['href']
dart_list = company,report,report_link
darts = []
for report_link in dart_list:
dart = report_link
darts.append(dart)
new_darts=[]
for dart in darts:
if dart not in old_darts:
new_darts.append(dart)
return new_darts
def print_darts():
global old_darts
new_darts = extract_darts(old_darts)
if new_darts:
for dart in new_darts:
print(dart)
else:
print('[공시 없음]')
old_darts += new_darts.copy()
old_darts = list(set(old_darts))
print_darts()
sched.add_job(print_darts, 'interval', seconds=3)
sched.start()
1 답변
-
*편의를 위해 질문자님께서 출력하려 하시는 정보(리스트)들을 '공시 정보'라 부르겠습니다.
extract_darts()에서 해당 공시 정보를 dart_list에 대입한 부분이 잘못되었습니다.
dart_list에 공시 정보를 등호
=
로 지정할 경우, for문 안에서 계속 dart_list에 공시 정보가 덮어씌워집니다.그러다 결국 for문이 끝나면 dart_list 값은 마지막 (5번째) 공시 결과가 돼 버립니다.
때문에 출력 결과가 마지막(5번째) 공시 정보 뿐인 것입니다.
for tr in trs: # 생략 dart_list = company,report,report_link # 잘못된 부분 # dart_list 값 : 5번째 공시 정보
질문자님의 의도대로 작동시키기 위해선 dart_list에 해당 정보들을 append()해야 합니다.
dart_list = [] for tr in trs: # 생략 dart_list.append([company,report, report_link]) # dart_list 값 : [1번째 공시 정보, 2번째 공시 정보, ..., 5번째 공시 정보]
다음은 이를 수정한 전체 코드입니다.
from bs4 import BeautifulSoup import urllib.request import re from apscheduler.schedulers.blocking import BlockingScheduler sched = BlockingScheduler() old_darts = [] def extract_darts(old_darts=[]): with urllib.request.urlopen("http://dart.fss.or.kr/dsac001/mainAll.do") as response: html = response.read() soup = BeautifulSoup(html, 'html.parser') trs = soup.findAll('tr')[1:5+1] dart_list = [] # 추가된 부분 for tr in trs: td = tr.findAll('td') company = re.sub(r'[\t\n\r ]', '', td[1].find('a').text) report = re.sub(r'[\t\n\r ]', '', tr.findAll('td')[2].find('a').text) report_link = 'dart.fss.or.kr' + tr.findAll('td')[2].find('a').attrs['href'] dart_list.append([company,report,report_link]) # 수정된 부분 darts = [] for report_link in dart_list: dart = report_link darts.append(dart) new_darts=[] for dart in darts: if dart not in old_darts: new_darts.append(dart) return new_darts def print_darts(): global old_darts new_darts = extract_darts(old_darts) if new_darts: for dart in new_darts: print(dart) else: print('[공시 없음]') old_darts += new_darts.copy() old_darts = list(map(list, set(map(tuple, old_darts)))) # 수정된 부분 (list는 행렬로 변환이 불가하므로 tuple 형태로 변환한 후 행렬로 변환합니다.) print_darts() sched.add_job(print_darts, 'interval', seconds=3) sched.start()
답변이 도움되셨길 바랍니다!
-
(•́ ✖ •̀)
알 수 없는 사용자
- 정말 감사합니다!! 덮어씌워지는 줄은 몰랐네요..! 반복되는 질문에 죄송하지만 출력할 때 report_link 주소 부분을 줄 띄움하고 출력하게 하는게 가능할까요..?? 초보자 2020.2.22 15:05
- 이해가 잘 안 되서ㅠㅠ 예를 들어 주시겠어요? 알 수 없는 사용자 2020.2.22 18:14
- 감사합니다...! 같은 값만 출력할 때는 [company, report, '\n' report_link] 으로 출력이 되었는데 지금은 [company, report, report_link] 으로 출력이 되어서요. dart_list.append 값 중간에 '\n'을 넣어도 안되는 것 같아서 혹시 방법을 아실까 해서 여쭤봅니다 초보자 2020.2.22 19:15
- print(dart)를 print('\t'.join(dart))로 변경하면 가독성 있게 출력이 가능합니다. report_link만 줄바꿈하고 싶으신 거라면 print('%s\t%s\n%s' % tuple(dart)) 이렇게 변경하시면 됩니다. 알 수 없는 사용자 2020.2.22 19:21
- 빠르고 친절한 답변 정말 감사합니다!! 좋은 주말 되세요!! 초보자 2020.2.22 19:24
- 거듭되는 질문에 죄송합니다.. 혹시 [company, report_link] 또는 [report, report_link] 과 같은 식으로 일부분만 출력하게 하는 것도 가능한가요..?? 그냥 가능 여부가 갑자기 궁금해져서.. 죄송합니다.. ㅜㅜ 초보자 2020.2.23 09:09
- dart[0]에는 campany, dart[1]에는 report, dart[2]에는 report_link 값이 담겨 있습니다. 이를 활용하시면 됩니다. 예를 들어 company, report_link만 출력하려 한다면 dart[0], dart[2]만 출력하면 됩니다. print('%s\t%s' % (dart[0], dart[2])) 이렇게요. report, report_link만 출력하려 한다면 print('%s\t%s' % (dart[1], dart[2])) 이렇게 호출하면 되겠죠? 알 수 없는 사용자 2020.2.24 09:52
- 가능 여부만 알려주셔도 됐는데 방법까지!! 답변 정말 감사합니다!! 초보자 2020.2.24 13:40
-
댓글 입력