티스토리 뷰
BeautifulSoup 라이브러리에서 가장 널리 쓰이는 객체는 물론 BeautifulSoup 객체입니다.
또 잘못된 HTML을 수정하여 쉽게 탐색할 수 있는 XML 형식의 파이썬 객체로 변환하므로 골치 아픈 웹을 탐색할 때 유용합니다.
BeautifulSoup 객체
원하는 정보를 둘러싼, 혹은 그 주변에 태그가 있기만 하면 HTML(XML) 파일에서 어떤 정보든 추출할 수 있습니다.
1 2 3 4 5 | from urllib.request import urlopen from bs4 import BeautifulSoup html=urlopen("http://www.pythonscraping.com/pages/page1.html") bsObj=BeautifulSoup(html.read(),"html.parser") print(bsObj.h1) | cs |
출력 결과는 <h1>An Interesting Title</h1>
신뢰할 수 있는 연결
웹 스크레이핑 중 생길 수 있는 예외는 총 3가지 입니다.
● 페이지를 찾을 수 없거나, URL 해석에서 에러가 생긴 경우
● BeautifulSoup객체가 태그에 접근할 때 태그가 존재하지 않는 경우
● 서버를 찾을 수 없는 경우
첫 번째 상황에서는 HTTPError가 반환될 것입니다. 이런 경우에는 urlopen함수는 범용 예외인 HTTPError를 일으킵니다. 이 예외는 다음과 같이 처리합니다.
그리고 두 번째 상황에서는 존재하지 않는 태그에 접근을 시도하면 Beautifulsoup는 None 객체를 반환합니다. 문제는 None 객체 자체에 태그가 있다고 가정하고 그 태그에 접근하려 하면 AttributeError가 일어날 것입니다.
이러한 상황에 대처하기 위해서 가장 쉬운 방법은 명식적으로 체크하는 겁니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from urllib.request import urlopen from urllib.request import HTTPError from bs4 import BeautifulSoup def getTitle(url): try: html=urlopen(url) except HTTPError as e: #페이지를 찾을 수 없거나, URL해석에서 에러가 생긴 경우 return None try: bsObj=BeautifulSoup(html.read(),"html.parser") title=bsObj.body.h1 except AttributerError as e: #None객체 자체에 태그가 있다고 가정하고 그 태그에 접근하려 할 경우 발생 return None return title title=getTitle("http://www.pythonscraping.com/pages/page1.html") if title==None: print("Title could not be found") else: print(title) | cs |
이 예제에서는 페이지 타이틀을 반환하거나, 어떤 문제가 있으면 None 객체를 반환하는 getTitle 함수를 만듭니다. getTitle 내부에서는 HTTPError를 체크하고 BeautifulSoup 행 두개를 try 문으로 캡슐화 합니다. 이 두 행 중 어느 행이라도 AttributeError를 일으킬 수 있습니다. try문 하나에 원하는 만큼 여러 행을 넣을 수도 있고, AttributeError를 일으킬 수 있는 별도의 함수도 어느 시점에서든 호출할 수 있습니다.
'python > 웹 크롤링(python)' 카테고리의 다른 글
API에서 얻은 데이터와 웹 스크레이퍼 결합하기!!! (0) | 2018.05.05 |
---|---|
크롤링의 시작 (0) | 2018.05.02 |
고급 HTML 분석 (0) | 2018.05.01 |
urllib 라이브러리 (0) | 2018.04.29 |
댓글