KBO 프로야구 팀 순위를 보여주는 파이썬 프로그램을 만들자.
- 소스 데이터는 http://sports.news.naver.com/kbaseball/record/index.nhn?category=kbo&year=2017 링크에 있습니다.
- 이곳에 있는 데이터를 urllib.request.urlopen, BeautifulSoup 등을 이용하여 처리합니다.
- JSON 텍스트 형태의 데이터를 진짜 JSON으로 변환합니다.
- 필요한 데이터를 가져옵니다.
- 추가적으로 팀 이름에 한글이 포함된 경우 좀 더 보기 좋게 표현하도록 처리했습니다. (preformat_cjk 함수)
소스입니다.
import json import unicodedata import urllib.request from bs4 import BeautifulSoup def preformat_cjk (string, width, align='<', fill=' '): count = (width - sum(1 + (unicodedata.east_asian_width(c) in "WF") for c in string)) return { '>': lambda s: fill * count + s, '<': lambda s: s + fill * count, '^': lambda s: fill * (count / 2) + s + fill * (count / 2 + count % 2) }[align](string) baseballData = urllib.request.urlopen('http://sports.news.naver.com/kbaseball/record/index.nhn?category=kbo&year=2017') source = baseballData.read() baseballData.close() soup = BeautifulSoup(source,'html.parser') soup = soup.find_all('script') for script in soup: line = str(script) if 'var ' in line and 'jsonTeamRecord' in line: recordList = line.split('jsonTeamRecord = ') for record in recordList: if record.startswith('{'): recordLine = record.splitlines() for finalLine in recordLine: if finalLine.endswith('}]};'): recordJsonData = finalLine r = json.loads(recordJsonData[:-1]) regularTeamRecordList = r['regularTeamRecordList'] order=0 for team in regularTeamRecordList: t = json.loads(str(team).replace("'",'"')) order += 1 tn = preformat_cjk(t['teamName'], 10) won = t['won'] lost = t['lost'] winDiff = t['winDiff'] recentResult = t['recentResult'] print('%02d %s %s %s %-5s %s' % (order, tn, won, lost, winDiff, recentResult))
결과
01 KIA 67 37 0 5승-5패-0무 02 NC 62 44 6 4승-6패-0무 03 두산 60 43 6.5 8승-2패-0무 04 LG 54 49 12.5 4승-6패-0무 05 넥센 56 52 13 4승-6패-0무 06 SK 55 55 15 4승-6패-0무 07 롯데 53 53 15 6승-4패-0무 08 한화 43 61 24 5승-5패-0무 09 삼성 43 62 24.5 4승-6패-0무 10 kt 34 71 33.5 4승-6패-0무