ㅡ.ㅡ

[Python/Crawling] urllib - 특정 데이터 추출 및 파일 저장(CSV) 본문

Coding

[Python/Crawling] urllib - 특정 데이터 추출 및 파일 저장(CSV)

ekwkqk12 2018. 4. 30. 03:08

CSV 파일로 데이터 저장하기

CSV모듈과 re모듈을 사용하여 한빛 미디어 책 목록 페이지에서 정규표현식을 활용하여 책에 이름과 상세정보가 담긴 링크를 추출하여 CSV파일에 저장하는 코드이다. 해당 코드에 사용된 중요한 함수와 정규표현식에 대한 설명은 아래 표와 같다.

 

from urllib.request import urlopen import re, csv from html import unescape  # 웹 페이지 읽어오기 req = urlopen("http://www.hanbit.co.kr/store/books/full_book_list.html") encoding = req.info().get_content_charset(failobj="utf-8") html = req.read().decode(encoding)  # CSV 파일 생성 with open("book_list.csv", 'w', newline='', encoding="utf-8-sig") as f:     writer = csv.writer(f)     writer.writerow(["BookName", "URL"]) # 첫 줄에 헤더 작성     # 특정 데이터 추출     for partial_html in re.findall(r'<td class="left"><a.*?</td>', html, re.DOTALL):         url = re.search(r'<a href="(.*?)">', partial_html).group(1)         url = 'http://www.hanbit.co.kr' + url         title = re.sub(r'<.*?>', '', partial_html)         title = unescape(title)         # csv파일에 데이터 저장         writer.writerow([title, url])

함수 및 매개변수
설명
re.findall() 정규 표현식에 일치하는 모든 부분을 추출
re.search() 두 번째 매개변수(문자열)가 첫 번째 매개변수(정규표현식)에 일치하는지 확인하여 일치할 경우 Match 객체를, 일치하지 않을 경우 None을 반환
group() 메서드로 일치한 값을 추출 (매개변수에 0을 지정 시 모든 값을 반환, 1이상의 숫자를 지정 시()로 감싼 부분에 해당하는 값을 추출)
re.sub() 정규 표현식에 일치하는 부분을 변경
unescape() html에 저장된 문자열을 특수문자로 변환ex) &amp -> &, &quot -> ", &gt -> >, &lt -> <
csv.writer() CSV 파일을 지정하여 객체 생성
open(newline=””) 줄 바꿈 자동 변환 LF -> CRLF
writerow() 한 줄 입력

 

 

정규 표현식 설명
. 모든 문자
* 0번이상 반복
? 있어도 되고 없어도 된다
r' <a.*?
r'' a태그의 href 속성의 값(링크)

 

생성된 CSV파일을 확인한 결과 아래 그림과 같이 책이름과 링크가 저장된것을 볼 수 있다.