웹크롤링을 하다 보면 테이블 데이터를 수집할 때가 있습니다. HTML에서 테이블은 <table>, <tr>, <td> 태그로 구성됩니다. 판다스의 데이터 프레임으로 바꾸기 어려운 구조이지만, 행단위로 데이터 프레임에 집어넣으면 못 넣을 것도 없습니다. 하지만 누군가가 더 쉽게 할 수 있는 방법을 만들었습니다. 오늘은 HTML 표(table) 판다스 데이터프레임으로 쉽게 바꾸는 방법에 대해서 알아보겠습니다.

 

 

1. table태그 데이터 수집

예를 들어 아래와 같이 여신금융협협회 공시정보포털에 있는 데이터를 크롤링한다고 가정해 보겠습니다. 신용・체크카드 이용현황이 표로 작성돼 있습니다. 이 페이지는 urllib패키지를 이용해서 크롤링할 수 없습니다. 동적으로 생성되는 페이지이기 때문인데요. 이런 경우에는 셀레늄(sellenium)을 이용하는 것이 편리합니다.



표에 해당하는 태그를 수집하면 아래와 같이 표에 대한 내용이 하나도 없습니다.

 

<table class="data-table">
 <colgroup>
 <col width="154px"/>
 <col width="129px"/>
 <col width="129px"/>
 <col width="129px"/>
 <col width="129px"/>
 <col width="129px"/>
 <col width="129px"/>
 <col width="129px"/>
 <col width="129px"/>
 </colgroup>

 <thead>
 <tr>
 <th rowspan="2">구분</th>
 <th colspan="2">1/4 분기</th>
 <th colspan="2">2/4 분기</th>
 <th colspan="2">3/4 분기</th>
 <th colspan="2">4/4 분기</th>
 </tr>
 <tr>
 <th>수</th>
 <th>비중</th>
 <th>수</th>
 <th>비중</th>
 <th>수</th>
 <th>비중</th>
 <th>수</th>
 <th>비중</th>
 </tr>
 </thead>

 <tbody id="tbody1">
 <!-- loop start -->
 <!-- loop end -->
 </tbody>
 </table>

 

 

동적으로 생성되는 페이지는 셀레니움(sellenium)을 이용해서 스크래핑을 합니다.

 

# coding = utf-8
 
from selenium import webdriver
from bs4 import BeautifulSoup
 
browser = webdriver.Chrome('/Users/open/Documents/chromedriver/chromedriver')
browser.get("https://gongsi.crefia.or.kr/portal/creditcard/creditcardDisclosureDetail10?cgcMode=10")
 
result_html = browser.page_source
result_soup = BeautifulSoup(result_html, 'html.parser')
tags = result_soup.find_all("table", attrs={"class":"data-table"})[0]

 

 

표에 해당하는 데이터는 추출했고, 이제 분석하기 좋은 데이터로 바꾸면 됩니다. tr, td태그를 이용해서 바꿀 수도 있지만, 태그 정보도 찾고 for문도 써야 해서 귀찮습니다. 이때 쉽게 판다스 데이터프레임으로 바꾸는 방법이 2가지 있습니다.

 

 

2. html_parser 패키지 이용

html_parser패키지는 HTML의 table태그를 파이썬에서 사용하기 쉽게 변환해줍니다. make2d함수를 이용하면 칼럼 기준으로 데이터를 바꾸기 때문에, 판다스 데이터 프레임으로 변환하기 쉽습니다.

 

from html_table_parser import parser_functions as parser
html_table = parser.make2d(tags)

 

 

칼럼 기준으로 데이터를 바꿨으면, 칼럼 제목을 지정하고 데이터 프레임으로 변환하면 됩니다.

 

import pandas as pd
 
df=pd.DataFrame(html_table[1:], columns=html_table[0])

 

 

3. 판다스(pandas) 패키지 read_html 함수 이용

위의 html_table_parser를 이용하는 것도 편리하지만, 그보다 더 쉬운 방법이 있습니다. 판다스 패키지의 read_html함수를 이용하는 것인데요. tag를 바로 데이터 프레임으로 변경할 수도 있습니다.

 

df = pd.read_html(tags)

 

 

이 함수에 입력 파라미터로 url을 넣으면, 해당 url에 있는 table태그를 모두 데이터프레임으로 변경해 줍니다. 예를 들어 아래와 같이 사용할 수 있습니다. 아래 url에는 코스피200 종목 리스트가 있는데, 한 번에 판다스 데이터프레임으로 가져올 수 있습니다.

 

table = pd.read_html(https://stock.infoking.site/kospi200info)
df = table[0]

 

table 태그가 여러 개일 수 있기 때문에, 튜플 자료형으로 결괏값이 반환됩니다. 그중에서 필요한 테이블이 있는 인덱스의 데이터를 가져오면 됩니다.

 

 

파이썬 독학 필수! 추천 무료 강의 사이트 BEST3는?!

파이썬을 배울 수 있는 소스는 많습니다. 유료 강의도 많이 있지만, 무료 도서나 강의도 퀄리티가 높은데요. 파이썬은 프로그래밍 언어 중에서도 문법이 쉽고 직관적이기 때문에 배우기 쉽습니

aplab.tistory.com

 

오늘은 이렇게 HTML 표(table) 판다스 데이터프레임으로 쉽게 바꾸는 방법에 대해서 알아보았습니다. HTML 표의 tr, td태그를 이용해서 데이터프레임으로 변경할 수 있지만, 번거롭습니다. html_parser패키지를 이용하면 몇 줄의 코드로 쉽게 변경할 수 있습니다. 하지만 이마저도 패키지를 설치하는 등의 번거로움이 있는데요. 판다스 패키지의 read_html 함수를 이용하는 것이 가장 편리합니다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기