친구의 노가다를 조금 덜어주기 위해
파이썬으로 웹에 있는 테이블을 파싱해서 엑셀로 만들어주는 소스를 짜봤다.
아래의 사이트에서 테이블에 있는 데이터를 엑셀로 저장하는 것이다.
노가다로 하나씩 복사 붙여넣기 할 수 없으니까...
python으로 웹파싱이 쉬운 것을 생각했다.
Beautiful Soup 를 사용했다.
beautifulsoup는 웹파싱하기에 쉽고 간단하다.
아래 사이트에서 다운 받는다.
http://www.crummy.com/software/BeautifulSoup/
이용할 라이브러리 - BeautifulSoup, csv, urllib2
- # -*- coding: utf-8 -*-
- import csv
- import urllib2
- import BeautifulSoup
- f = urllib2.urlopen(url)
- page = f.read().decode('cp949', 'ignore')
- f.close()
- soup = BeautifulSoup.BeautifulSoup(page)
- title_t = soup.find("tr", {"class" : "csfiedName"})
- title_row = title_t.findAll("td")
- headers = []
- #타이틀 저장
- for i in range(0, len(title_row)):
- headers.append(title_row[i].find(text=True).strip().encode('cp949'))
- all_cols = soup.findAll("tr", {"class" : "cspartsListFont2"})
- cols = []
- #내용 저장
- for i in range(0, len(all_cols)):
- for j in range(0, len(title_row)):
- cols.append(all_cols[i].findAll("td")[j].find(text=True).strip().encode('cp949'))
- with open('table.csv', 'w') as f:
- f_csv = csv.writer(f)
- f_csv.writerow(headers)
- 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파일로 저장
완벽하게 완성되지는 않았지만 대충 노가다 하는 거보다는 시간을 훨씬 절약할 것이다.
'IT > Python' 카테고리의 다른 글
[자연어처리] a little spell-checker using string edit distance (0) | 2014.12.19 |
---|---|
파일을 만들기 전에 파일 존재 확인하는 코드 (0) | 2014.12.19 |
python txt파일 읽기 에러 'cp949' (4) | 2014.12.19 |
sklearn.cross_validation.train_test_split(*arrays, **options) (0) | 2014.12.19 |
[error] AttributeError: 'module' object has no attribute 'cluster' (0) | 2014.12.19 |