본문으로 바로가기

https://slideplayer.com/slide/13283077/

보통 <table> 안에 <thead>, <tbody>가 들어있고 

<thead> 안에 <tr>, <th>가 위의 그림과 같이,

<tbody> 안에 <tr>, <td>가 위의 그림과 같이 들어있는 형태이다.

tr : 하나의 행

td : 하나의 열

th : 열이름

 

우리는 tbody 태그가 있다면 <tbody>를 통째로 꺼내서 필요한 태그 하나씩 꺼내쓰면 된다.

 


1. 라이브러리 설치

import requests
from bs4 import BeautifulSoup

url = 'http://finance.naver.com'
res = requests.get(url).content
soup = BeautifulSoup(res, 'html.parser')

 

2. tbody 통으로 꺼내기

top_items = soup.find('tbody', {'id':'_topItems1'})

 

3. 원하는 태그 하나씩 꺼내기

top_items = soup.find('tbody', {'id':'_topItems1'})
item_rows = top_items.find_all('tr') 

for item in item_rows:
    item_name = item.find('th').get_text()  # 종목명
    item_price = item.find_all('td')[0].get_text()  # 현재값
    item_delta_price = item.find_all('td')[1].get_text()  # 가격변화값
    item_delta_percent = item.find_all('td')[2].get_text()  # 가격변화율
    
    print(item_name, item_price, item_delta_price, item_delta_percent)

 

4. 최종 정리하면,

top_items = soup.find('tbody', {'id':'_topItems1'})
item_rows = top_items.find_all('tr') 

plus_items = [] # 백분율 변화량이 + 부호인 종목들을 모을 list
highest_item = {'top_name':'', 'percent_change':0} # 백분율 변화량이 + 부호인 종목 중 가장 큰 비율로 증가한 종목을 담을 dict

for item in item_rows:
    item_name = item.find('th').get_text()
    item_price = item.find_all('td')[0].get_text()
    item_delta_price = item.find_all('td')[1].get_text()
    item_delta_percent = item.find_all('td')[2].get_text().strip()
    
    print('{} : 현재가 {}, 어제보다 {} {}, 백분율 변환 시{}'.format(
        item_name, item_price, item_delta_price[3:], item_delta_price[:2], item_delta_percent))
    
    # 백분율 변화량 기호가 '+' 이면
    if item_delta_percent[0] == '+':
        plus_items.append(item_name)
        
        # sorted 함수를 사용하는 것이 더 빠를 수도
        # 백분율 변화량 기호가 '+' 이고 변화량 수치(+4.84% -> 4.84)가 기존 가장 큰 증가 비율보다 클 경우, 
        # [1:-1] (기호 떼고 % 떼고 수치값만 출력)
        if float(item_delta_percent[1:-1]) > highest_item['percent_change']:   # 처음은 0
            highest_item['top_name'] = item_name
            highest_item['percent_change'] = float(item_delta_percent[1:-1])
        
plus_items = ', '.join(plus_items) # [W홀딩컴퍼니, 에이치엘비파워, 퓨전데이타] -> 'W홀딩컴퍼니, 에이치엘비파워, 퓨전데이타'

print('\n어제보다 상승한 종목은 [ {} ]입니다.'.format(plus_items))
print('어제보다 가장 많이 상승한 종목은 [ {} (+{}%) ]입니다.'.format(
    highest_item['top_name'], highest_item['percent_change']))