파이썬에서 크롤링을 학습하기위해 간단하면서 가장 기초가되는 기능들을 사용할 수 있게해주는 라이브러리라고 생각합니다.
BeautifulSoup은 HTML, XML 파일에서 데이터를 쉽게 추출할 수 있게 도와주는 파이썬 라이브러리입니다. 웹 스크래핑(Web Scraping) 작업에서 자주 사용되며, 복잡한 HTML 문서에서도 원하는 정보를 구조적으로 추출할 수 있게 해줍니다.
주요 기능
HTML 파싱: BeautifulSoup은 HTML 문서를 트리 구조로 변환하여 파싱할 수 있습니다. 이를 통해 태그, 속성, 내용 등에 쉽게 접근할 수 있습니다.
다양한 파서 지원: 기본적으로 Python 내장 HTML 파서를 사용하지만, lxml, html5lib와 같은 다른 파서를 사용할 수도 있습니다.
검색 및 탐색: 트리 구조로 변환된 문서에서 태그 이름, 속성, 텍스트 등을 기준으로 요소를 쉽게 찾을 수 있습니다.
내용 수정: 찾은 HTML 태그의 속성이나 내용을 수정할 수 있어 웹 페이지에서 데이터를 추출하는 것뿐만 아니라 페이지를 재구성하는 데도 사용할 수 있습니다.
유연한 처리: 잘못된 HTML 문서를 만나도 BeautifulSoup은 이를 최대한 이해하고 파싱해 줍니다.
설치 방법
BeautifulSoup은 bs4라는 패키지로 제공되며, pip을 사용하여 쉽게 설치할 수 있습니다.
설치 명령어
pip install beautifulsoup4
BeautifulSoup은 HTML 파싱을 위해 다양한 파서를 사용할 수 있습니다. 기본적으로 파이썬 내장 파서인 html.parser를 사용하지만, 더 빠르거나 복잡한 HTML을 처리하기 위해 lxml 또는 html5lib 같은 외부 파서를 설치할 수 있습니다.
pip install html5lib
pip install lxml
설치가 완료되면, 간단한 테스트를 통해 정상적으로 설치되었는지 확인 할 수 있습니다.
from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("https://uno-kim.tistory.com/249")
bs = BeautifulSoup(html, 'html.parser')
print(bs.h1)
실행결과
제 포스팅중 하나에 그리고 H1태그가 나타났습니다.
예외 처리
이제 실무 또는 클롤링 환경에서 가장 많이 나타나는 예외 처리중 하나로는
찾으려는 URL오류
찾으려는 태그, 엘리먼트, 속성 등이 없다.
이렇게 되겠습니다.
찾으려는 URL에 대한 오류 아래처럼 코드를 try...catch를 이용해서 진행하겠습니다. 티스토리 글넘버링에 zz를 추가하여 티스토리 포스팅에 대해 없는 것을 호출 시키도록 하겠습니다.
from urllib.request import urlopen
from urllib.request import HTTPError
from bs4 import BeautifulSoup
try:
html = urlopen("https://uno-kim.tistory.com/249zz")
except HTTPError as e:
print(e)
else:
bs = BeautifulSoup(html, 'html.parser')
print(bs.body)
#프로그램 계속 진행
from urllib.request import urlopen
from urllib.request import HTTPError
from bs4 import BeautifulSoup
try:
html = urlopen("https://uno-kim.tistory.com/249zz")
except HTTPError as e:
print(e)
else:
bs = BeautifulSoup(html, 'html.parser')
print(bs.body)
#프로그램 계속 진행
실행결과는
except 문을 통해서 404 경고가 출력된것을 확인 할 수 있습니다.
찾으려는 태그, 엘리먼트, 속성 등이 없는 경우 이제 Body부분을 찾는 동작을 함수로 만들고 진행해보겠습니다. body부분이 있으면 출력, 없다면 None을 리턴하고, 조건절에서 body가 있는지 판별하는 소스입니다.
from urllib.request import urlopen
from urllib.request import HTTPError
from urllib.request import URLError
from bs4 import BeautifulSoup
def getBody(url):
try:
html = urlopen(url)
except HTTPError as e:
print(e)
except URLError as e:
print(e)
else:
bs = BeautifulSoup(html, 'html.parser')
try:
body = bs.body
except AttributeError as e:
return None
return body
url_body = getBody("https://uno-kim.tistory.com/249")
if url_body == None:
print('바디태그가 없습니다.')
else:
print(url_body)
실행하면 해당 화면처럼 body부분이 출력됩니다. 이제 한번 태그를 없는것으로 지어내서 실행해보겠습니다.
try:
body = bs.qqqqqqqqq
except AttributeError as e:
return None
return body
이렇게 노골적으로 이상한 태그를 찾도록 해보겠습니다.
찾으려는 태그가 없는 경우 이렇게 나타납니다.
이떄 이제 예외처리를 철저하게 만들고 빠르고 믿을 수 있는 웹 스크페이퍼를 만드는 기초 단계가
마무리되었습니다.
웹 스프레퍼, 크롤링 등 웹 정보를 가져오는 간단한 함수였지만 앞으로 계속 더 학습해 나가보겠습니다.
댓글