본문 바로가기
IT/Python

python beautifulsoap - table parsing

by Jang HyunWoong 2014. 12. 19.

친구의 노가다를 조금 덜어주기 위해 

파이썬으로 웹에 있는 테이블을 파싱해서 엑셀로 만들어주는 소스를 짜봤다. 

 

아래의 사이트에서 테이블에 있는 데이터를 엑셀로 저장하는 것이다. 

 

  

 

노가다로 하나씩 복사 붙여넣기 할 수 없으니까...

 

python으로 웹파싱이 쉬운 것을 생각했다. 

 

Beautiful Soup 를 사용했다. 

beautifulsoup는 웹파싱하기에 쉽고 간단하다. 

아래 사이트에서 다운 받는다. 

 

http://www.crummy.com/software/BeautifulSoup/

 

이용할 라이브러리 - BeautifulSoup, csv, urllib2

 

  1. # -*- coding: utf-8 -*-
  2. import csv
  3. import urllib2
  4. import BeautifulSoup
  5.  
  6. = urllib2.urlopen(url)
  7. page = f.read().decode('cp949', 'ignore')
  8. f.close()
  9. soup = BeautifulSoup.BeautifulSoup(page)
  10.  
  11. title_t = soup.find("tr", {"class" : "csfiedName"})
  12. title_row = title_t.findAll("td")
  13.  
  14. headers = []
  15.  
  16. #타이틀 저장
  17. for i in range(0, len(title_row)):
  18.         headers.append(title_row[i].find(text=True).strip().encode('cp949'))
  19.  
  20. all_cols = soup.findAll("tr", {"class" : "cspartsListFont2"})
  21. cols = []
  22.  
  23. #내용 저장
  24. for i in range(0, len(all_cols)):
  25.         for j in range(0, len(title_row)):
  26.                 cols.append(all_cols[i].findAll("td")[j].find(text=True).strip().encode('cp949'))
  27.  
  28. with open('table.csv', 'w') as f:
  29.         f_csv = csv.writer(f)
  30.         f_csv.writerow(headers)
  31.         f_csv.writerow(cols)

2-4 line.

필요한 패키지를 import 한다. 

 

6-10 line.

url주소를 통해 소스를 읽어 오는데 인코딩 문제가 있기 때문에 8번 라인을 삽입했다. 

읽어 온 소스를 beautifulsoup에 넣는다. 

 

12-13 line.

소스에서 tr 태그를 찾는데 클래스가 csfiedName 인 것을 찾아 리스트르 만든다. 

title_row 변수에 td태그를 넣는다. 그렇게 되면 td안에 있는 내용이 다 들어간다. 

 

15 line.

제목이 들어갈 리스트를 만든다. 

 

18-19 line.

headers 리스트에 제목 수만큰 for문을 사용해서 텍스트를 넣는다. 

titile_row 배열에 차곡차곡 들어가 있기 때문에 for문을 써서 넣었다. 

 

21-22 line.

내용 부분인 tr의 cspartsListFont2 클래스를 찾아 다 넣는다. 

cols 리스트를 만든다. 

 

25-27 line.

먼저 tr 태그가 약 20개? 된다. 

그 안에 td 태그 안에 있는 글들을 하나의 리스트로 만들고 

계속적으로 추가해 주면 여러 개의 tr에서 td들을 빼올 수 있다. 

 

인코딩 때문에 .encode('cp949') 를 넣어주어야 한다. 

 

29-32 csv파일로 저장

 

완벽하게 완성되지는 않았지만 대충 노가다 하는 거보다는 시간을 훨씬 절약할 것이다. 

 

반응형