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


댓글 없음:
댓글 쓰기