2013년 5월 10일 금요일

[python] BeautifulSoup 웹 파징 예제



파징하고자 하는 사이트는 여기 며 궁극적으로 사이트에서 추천하는 샌드위치 상점들의 정보를 파징하는 예제입니다.


from bs4 import BeautifulSoup # 파징을 위한 BeautifulSoup 모듈 임포트
from urllib2 import urlopen # url 처리를 위한 BeautifulSoup 모듈 임포트
import csv # 추출한 정보를 저장하기 위한 csv 모듈 임포트

base_url = ("http://www.chicagomag.com/Chicago-Magazine/"
            "November-2012/Best-Sandwiches-Chicago/")

soup = BeautifulSoup(urlopen(base_url).read())

# div 중 class 가 sammy 인 element 찾기
sammies = soup.find_all("div", "sammy") 

#sammies 안에 있는 div 에 대해서 div 하위의 a 를 찾아 href 값을 저
sammy_urls = [div.a["href"] for div in sammies]



fieldnames = ("rank", "sandwich", "restaurant", "description", "price",
                "address", "phone", "website")

for url in sammy_urls:
    url = url.replace("http://www.chicagomag.com", "")  # inconsistent URL

    # 특별히 하는 이유는 모르겠으나 format 함수를 이용해 스트링 수정 가능
    # 위의 예제에서 파징했던 sammy_urls 링크로 이동
    page = urlopen("http://www.chicagomag.com{0}".format(url))  

    # div 중 id 가 sandwich 인 element 찾아 soup 객체에 저장
    soup = BeautifulSoup(page.read()).find("div", {"id": "sandwich"})

    # soup 객체 안의 div 중 id 가 sandRank 인 element 찾아 soup 객체에 저장
    # strip() : string 의 좌우 공백 제거
    rank = soup.find("div", {"id": "sandRank"}).encode_contents().strip()

    # soup 에서 h1 객체를 "br/" 로 split 한 후 인덱스가 0 인 리스트 저장
    sandwich = soup.h1.encode_contents().strip().split("br/")[0]

    restaurant = soup.h1.span.encode_contents()
    description = soup.p.encode_contents().strip()

    addy = soup.find("p", "addy").em.encode_contents().split(",")[0].strip()

    # partition(seperator) : seperator 로 string 을 
    # 3부분(seperator 전, sperator 자체, seperator 후)으로 나누고 리스트 리턴
    price = addy.partition(" ")[0].strip()
    address = addy.partition(" ")[2].strip()

    phone = soup.find("p", "addy").em.encode_contents().split(",")[1].strip()

    if soup.find("p", "addy").em.a:
        website = soup.find("p", "addy").em.a.encode_contents()
    else:
        website = ""


댓글 없음:

댓글 쓰기