파징하고자 하는 사이트는 여기 며 궁극적으로 사이트에서 추천하는 샌드위치 상점들의 정보를 파징하는 예제입니다.
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 = ""
댓글 없음:
댓글 쓰기