정보마당

파이썬 BeautifulSoup 속성값이 없을때(img src 값 조회)

IT(Idea Technology) 흑기사 2024. 11. 14. 16:16

파이썬으로 BeautifulSoup을 이용해서 데이터를 핸들링하는 경우가 많습니다. 그리고 크롤링할 때도 class나 img src의 속성값을 가져오는 경우도 많고요. 잘 되다가 언제부터인지 안 되는 경우가 생겼습니다. 왜일까요?  이미지의 속성값인 src를 조회하는데 특정 속성이 없는 경우에 대한 예외 처리는 매우 간단하게 할 수 있습니다. 속성이 없는 경우 None을 반환하거나 try-except 문을 사용할 수 있습니다. 아래 방법들을 참고하세요.

 

파이썬 BeautifulSoup 속성값이 없을때

 

먼저 어떤 케이스인지 알아보겠습니다. 처음에 데이터를 확인했을때는 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가 데이터가 들어온다. 헉...... 어떻게 하지?

 

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을 반환하거나 기본값을 설정하는 방식으로 안전하게 처리할 수 있습니다. 파이썬 크롤링할 때 정말 편하고 우리가 혹시 이런 경우는 어떻게 하지?라는 궁금증까지 모두 알아서 미리 처리할 수 있는 방법이 다 존재합니다. 파이팅