파이썬으로 BeautifulSoup을 이용해서 데이터를 핸들링하는 경우가 많습니다. 그리고 크롤링할 때도 class나 img src의 속성값을 가져오는 경우도 많고요. 잘 되다가 언제부터인지 안 되는 경우가 생겼습니다. 왜일까요? 이미지의 속성값인 src를 조회하는데 특정 속성이 없는 경우에 대한 예외 처리는 매우 간단하게 할 수 있습니다. 속성이 없는 경우 None을 반환하거나 try-except 문을 사용할 수 있습니다. 아래 방법들을 참고하세요.
먼저 어떤 케이스인지 알아보겠습니다. 처음에 데이터를 확인했을때는 img 태그의 data-src의 속성값을 조회해서 데이터를 가져왔어야 해서 간단하게 생각하고 진행을 했고 원하는 데이터를 추출했습니다.
from bs4 import BeautifulSoup
import re
html = """
<div class="item">
<span class="thumb">
<img alt="time1" class="time" data-src="https://naver.com/300.jpg" src="time.png"/>
</span>
</div>
<div class="item">
<span class="thumb custom">
<img alt="time2" data-src="https://naver.com/400.jpg" src="https://naver.com/400.jpg" />
</span>
</div>
"""
soup = BeautifulSoup(html,'html.parser')
pretty_html = soup.prettify()
data = soup.select('div.item')
for html in data:
srcInfo=html.select_one("img")["data-src"]
print(srcInfo)
#결과값 출력
#https://naver.com/300.jpg
#https://naver.com/400.jpg
그런데 어느 순간 데이터가 다르게 들어옵니다. 어느 때는 data-src값이 있고 어느때는 src값만 있는 데이터가 들어오는 것입니다. img data-src가 없는 img src가 데이터가 들어온다. 헉...... 어떻게 하지?
만일 단순하게 생각해서 이미지 태그의 data-src값과 src 값을 조회하도록 코딩을 하면 에러를 발생합니다. 아래화면이 그 에러입니다.
데이터의 속성값이 다르게 정의된 경우를 예로 들었지만 파싱 된 데이터를 조회하는 경우에도 적용이 됩니다. 에러를 처리하는 여러 가지 방법을 알아보도록 하겠습니다.
1. get() 메서드 사용하기
.get() 메서드를 사용하면 속성이 없을 때 None을 반환하므로 오류 없이 안전하게 사용할 수 있습니다. 즉 이미지 태그의 속성값을 가져오는데 없을 때는 None을 반환하기 때문에 이 부분을 체크해서 가져올 수 있습니다.
for html in data:
srcInfo=html.select_one("img")
src1=srcInfo.get("data-src")# 속성이 없으면 None을 반환
src2=srcInfo.get("src")
if(src1 is not None):
srcData=src1
elif(src2 is not None):
srcData=src2
2. try-except 구문 사용하기
속성이 없는 경우 예외를 발생시킬 수 있으므로 try-except를 사용하여 예외를 처리할 수 있습니다.
try:
srcInfo=html.select_one("img")["data-src"]# 속성이 없으면 KeyError 발생
except KeyError:
srcInfo=html.select_one("img")["src"] # 속성이 없을 때 대체값으로 src 조회
print(srcInfo)
데이터 크롤링을 하다 보면 DOM 구조가 변경되어서 예상외의 에러가 날 발생할 경우가 많은데 이처럼 에러 처리를 하면 쉽게 데이터 핸들링이 가능합니다. 최종 소스를 공개합니다.
from bs4 import BeautifulSoup
import re
html = """
<div class="item">
<span class="thumb">
<img alt="time2" class="time" data-src="https://naver.com/300.jpg" src="time.png"/>
</span>
</div>
<div class="item">
<span class="thumb custom">
<img alt="time2" src="https://naver.com/400.jpg" />
</span>
</div>
"""
soup = BeautifulSoup(html,'html.parser')
pretty_html = soup.prettify()
data = soup.select('div.item')
print("############### 1).get() 메서드 사용하기 ")
for html in data:
srcInfo=html.select_one("img")
src1=srcInfo.get("data-src")# 속성이 없으면 None을 반환
src2=srcInfo.get("src")
if(src1 is not None):
srcData=src1
elif(src2 is not None):
srcData=src2
print(srcData)
print("###############2). try catch")
for html in data:
try:
srcInfo=html.select_one("img")["data-src"]# 속성이 없으면 KeyError 발생
except KeyError:
srcInfo=html.select_one("img")["src"] # 속성이 없을 때 대체값으로 src 조회
print(srcInfo)
이와 같이 BeautifulSoup에서는 속성이 없을 경우 None을 반환하거나 기본값을 설정하는 방식으로 안전하게 처리할 수 있습니다. 파이썬 크롤링할 때 정말 편하고 우리가 혹시 이런 경우는 어떻게 하지?라는 궁금증까지 모두 알아서 미리 처리할 수 있는 방법이 다 존재합니다. 파이팅
'정보마당' 카테고리의 다른 글
프롬 단독 콘서트 Arrival on the moonbow 일정 및 티켓 예매 정보 안내 (1) | 2024.11.16 |
---|---|
2025 장윤정 라이브 콘서트 부산 일정 및 티켓 예매 정보 안내 (2) | 2024.11.15 |
2024 데이식스 연말 콘서트 일정 및 티켓 예매 정보 안내 (1) | 2024.11.12 |
24/25 임영웅의 리사이틀 콘서트 일정 안내 (1) | 2024.11.10 |
2024 고경표 팬 미팅 일정 및 티켓 예매 정보 안내 (1) | 2024.11.08 |