댓글 쓰기 권한이 없습니다. 로그인 하시겠습니까?
Python
2013.04.08 10:09
BeautifulSoup으로 웹에 있는 데이터 긁어오기
조회 수 78881 댓글 0
파이썬을 이용하여 게시판이나 웹페이지에 있는 데이터를 긁어 오기 위해 사용할 수 있는 라이브러리중에서 최선의 선택은 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 $ 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> 그리고 만화 제목은 a 태그의 text로 있으며, 링크는 a 태그의 href속성으로 나와 있다. 파이썬에서 해당 데이터를 처리해보자. 일단 웹에서 데이터를 읽어 오는 부분을 urllib로 구현하자. >>> data = urllib.urlopen('http://comic.naver.com/webtoon/list.nhn?titleId=20853&weekday=fri') 이 객체는 BeautifulSoup에 바로 넘겨서 파싱된 html객체를 얻을 수 있다. >>> soup = BeautifulSoup.BeautifulSoup(data) html태그에서 반복되는 태그를 찾아 처리하기 위해서는 findAll 메소드를 사용하면 된다. 해당된 태그를 list객체로 반환한다. findAll의 인자로는 찾고자하는 html 엘리먼트 이름이 필요하다. 자세한 메소드 설명은 BeautifulSoup manual을 참고하자. 두번째 인자로 html 엘리먼트의 attribute로 검색이 가능하다. 우리가 찾고자 하는 태그는 td태그이며, 해당 태그에는 class attribute값이 title로 지정되어 있다. 이것을 이용하여 원하는 태그를 검색해보자. >>> cartoons = soup.findAll('td', attrs={'class':'title'}) 그럼 이제는 각각의 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의 코드 스크랩내가 모으고 내가 보는
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Designed by sketchbooks.co.kr / sketchbook5 board skin
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5