티스토리 뷰

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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함