파이썬 출력 오류

조회수 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 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    *편의를 위해 질문자님께서 출력하려 하시는 정보(리스트)들을 '공시 정보'라 부르겠습니다.

    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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)