조회 수 76861 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
파이썬을 이용하여 게시판이나 웹페이지에 있는 데이터를 긁어 오기 위해 사용할 수 있는 라이브러리중에서 최선의 선택은 BeautifulSoup일 듯 하다.

1. BeautifulSoup 설치

http://www.crummy.com/software/BeautifulSoup/
위 사이트에서 다운 받을 수 있고 파이썬 라이브러리인 만큼 별도 설치하지 않고 같은 디렉토리에 복사만 하여도 사용 할 수 있다.

BeautifulSoup-3.2.0.tar.gz
위 주소로 라이브러리를 다운 받은 후

$ wget http://www.crummy.com/software/BeautifulSoup/download/3.x/BeautifulSoup-3.2.0.tar.gz

압축을 풀고

$ tar xvzf BeautifulSoup-3.2.0.tar.gz

필요한 파일만(BeautifulSoup.py) 사용 할 디렉토리로 복사하면 된다.

$ cp BeautifulSoup-3.2.0/BeautifulSoup.py .



2. 파이썬 인터프리터에서 테스트 하기

인터프리터를 실행하고 웹페이지 데이터를 긁어 오기 위해 대표적으로 필요한 urllib와 BeautifulSoup을 import한다.

>>> import urllib

>>> import BeautifulSoup


간단한 html 파싱을 테스트 해보자.

>>> html = '<div><span><a href=http://naver.com>naver.com</a></span></div>'

>>> soup = BeautifulSoup.BeautifulSoup(html)

>>> print soup.prettify()
< div>
<span>
<a href="http://naver.com">
naver.com
</a>
</span>
< /div>

BeautifulSoup은 스트링객체, i/o객체를 통해 파싱된 데이터를 만들 수 있다.
따라서 위에 예제처럼 스트링객체를 사용해서 만들수도 있고, 파일을 열어서 만든 i/o객체를 통해 만들 수 도 있다.
prettify() 메소드를 통해 파싱된 결과를 출력해 볼 수도 있다.

3. 마음의 소리 카툰 목록을 긁어 보자.
네이버 웹툰 마음의 소리의 제목과 글의 링크를 긁어 보자.
해당 페이지 링크는
http://comic.naver.com/webtoon/list.nhn?titleId=20853&weekday=fri
페이지를 소스보기로 html소스를 보고 적당한 패턴을 찾는다.
긁어오고자 하는 데이터마다 일정하고 유일하게 나타나는 html 태그를 찾는 것이 중요하다.
마음의 소리 페이지에서는 각 만화마다

<td class="title">


위 태그가 반복적으로 나타난다. 그리고 위 태그는 다른 곳에서는 나타나지 않고 만화 제목이 있는곳에만 반복적으로 나타단다.
제목을 구성하는 전체적인 html은 아래와 같다.

<td class="title">

<a href="/webtoon/detail.nhn?titleId=20853&no=538&weekday=fri"onclick="clickcr(this,'lst.title','20853','538',event)">534. 에티켓 시즌 1 </a>

</td>

구성을 보면 td태그로 우리가 원하는 데이터가 감싸져 있다.
그리고 만화 제목은 a 태그의 text로 있으며, 링크는 a 태그의 href속성으로 나와 있다.

파이썬에서 해당 데이터를 처리해보자.
일단 웹에서 데이터를 읽어 오는 부분을 urllib로 구현하자.

>>> data = urllib.urlopen('http://comic.naver.com/webtoon/list.nhn?titleId=20853&weekday=fri')

urlopen함수를 사용하여 http response데이터를 담고 있는 i/o객체를 얻는다.
이 객체는 BeautifulSoup에 바로 넘겨서 파싱된 html객체를 얻을 수 있다.

>>> soup = BeautifulSoup.BeautifulSoup(data)

이제는 soup객체에서 우리가 찾고자하는 태그를 검색해야 한다.
html태그에서 반복되는 태그를 찾아 처리하기 위해서는 findAll 메소드를 사용하면 된다.
해당된 태그를 list객체로 반환한다.
findAll의 인자로는 찾고자하는 html 엘리먼트 이름이 필요하다.
자세한 메소드 설명은 BeautifulSoup manual을 참고하자.
두번째 인자로 html 엘리먼트의 attribute로 검색이 가능하다.
우리가 찾고자 하는 태그는 td태그이며, 해당 태그에는 class attribute값이 title로 지정되어 있다. 이것을 이용하여 원하는 태그를 검색해보자.

>>> cartoons = soup.findAll('td', attrs={'class':'title'})

cartoons변수에 해당 태그들이 리스트로 담겨진다.
그럼 이제는 각각의 td태그에서 만화 제목과 링크를 따오자.
만화 제목은 td태그 안의 a태그이 text로 되어 있다. 이를 가져오기 위해서는 다시 find메소드를 사용해서 a태그를 얻고 거기서 text를 가져오면 된다.

>>> title = cartoons[0].find('a').text


링크는 a태그의 href속성 값이다. 위와 마찬가지로 find로 a태그를 찾고 href속성값을 가져오면 된다.

>>> link = cartoons[0].find('a')['href']






Beautiful Soup은 파이썬의 HTML 파싱 라이브러리입니다.

이것만 있으면 웹 파싱은 순식간입니다. 파이썬의 편의성과 Beautiful soup의 유연함이 만나 최강곰비를 이루게 됩니다. 백문이 불여일견이라고 하죠. 먼저 예제를 보여드리도록 하겠습니다. 네이버 웹툰의 웹툰 목록을 긁어오도록하겠습니다.

 

#-*- coding: cp949 -*-
import urllib
from bs4 import BeautifulSoup
html = urllib.urlopen('http://comic.naver.com/webtoon/weekday.nhn')
soup = BeautifulSoup(html, "lxml")
titles = soup.find_all("a", "title")
 
for title in titles:
    print 'title:{0:10s} link:{1:20s}\n'.format(title['title'].encode('utf-8'), title['href'].encode('utf-8'))

 

urllib을 이용해서 naver 웹툰의 html 파일을 갖어와서 lxml 파서를 이용해서 BeautifulSoup 객체로 변환시킨뒤 원하는 요소를 갖어오는 코드입니다. 파서는 파이썬에 기본적으로 들어있는 html.parser을 쓸 수 있고, lxml 파서를 사용할 수 도 있습니다. lxml 파서가 기본 파서보다는 더 좋은듯 합니다.

 

 


Dreamy의 코드 스크랩

내가 모으고 내가 보는

List of Articles
번호 분류 제목 날짜 조회 수 추천 수
506 LINUX awk 명령어 사용법 1 2006.02.16 114543 15
505 MFC CString 에서 형변환 함수들 총정리 2010.11.29 102653 0
504 Android adb am 명령어 ; app 실행 및 Intent 전송 2013.08.12 100137 0
503 Android [GIT 사용법] Git Tutorial 2011.12.26 96414 0
502 일반 ┗ bat(배치)파일 문법 2007.08.06 93358 8
501 LINUX [Shell Script] 리눅스 쉘(Shell) 스크립트 2014.09.23 86670 0
500 JAVA JAVA String 클래스 메소드 정리 1 2015.02.05 84883 0
499 LINUX [Shell Script] 쉘 스크립트에서의 사칙연산과 문자열 자르기 2014.11.01 81702 0
498 C# StringBuilder로 문자열 처리를 빠르게 2012.12.04 77888 0
497 LINUX du 명령어 사용법(디스크 용량 확인) 1 2012.05.31 77386 0
» Python BeautifulSoup으로 웹에 있는 데이터 긁어오기 2013.04.08 76861 0
495 Android [GIT 사용법] 초보자가 알아두면 좋을 명령어 정리 1 2011.12.26 66408 0
494 LINUX errno.h - system error numbers 2013.01.09 65717 0
493 MFC API를 이용하는 유니코드와 ANSI 문자열간의 변환 방법 2006.04.14 63030 0
492 일반 findstr 사용법 - window용 find, grep 명령 2014.02.04 62996 0
목록
Board Pagination ‹ Prev 1 2 3 4 5 6 7 8 9 10 ... 34 Next ›
/ 34

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5