IT/Python

python beautifulsoap - table parsing

Jang HyunWoong 2014. 12. 19. 12:16

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

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

 

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

 

  

 

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

 

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파일로 저장

 

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

 

반응형