본문 바로가기
코드리뷰/chatGPT(Python)코드

BeautifulSoup 이용해 웹 데이터 추출하기 - select, select_one, find, find_all

by 디마드 2025. 1. 12.
반응형

BeautifulSoup의 메서드 select, select_one, find, find_all은 HTML 문서에서 데이터를 추출하는 데 사용됩니다. 웹 사이트마다 다양한 방식으로 페이지를 구성되어 있어서 각 메서드에 대한 완벽한 이해가 필요합니다. 메서드 정의와 예제를 통해 사용법을 익혀보아요.

1. find()

정의

  • 조건에 맞는 첫 번째 태그를 반환합니다.
  • 태그 이름, 속성, 문자열 조건 등을 사용해 검색할 수 있습니다.

예제

 
from bs4 import BeautifulSoup

html = """
<html>
    <body>
        <div class="content">
            <p class="title">Title 1</p>
            <p class="description">Description 1</p>
        </div>
    </body>
</html>
"""

soup = BeautifulSoup(html, 'html.parser')

# 첫 번째 <p> 태그 찾기
first_p = soup.find('p')
print(first_p.text)  # 출력: "Title 1"

# 클래스가 'description'인 첫 번째 <p> 태그 찾기
description_p = soup.find('p', class_='description')
print(description_p.text)  # 출력: "Description 1"

2. find_all()

정의

  • 조건에 맞는 모든 태그를 리스트로 반환합니다.
  • limit 매개변수를 사용해 반환 개수를 제한할 수 있습니다.

예제

# 모든 <p> 태그 찾기
all_p = soup.find_all('p')
for p in all_p:
    print(p.text)

# 출력:
# "Title 1"
# "Description 1"

# 클래스가 'description'인 모든 태그 찾기
all_descriptions = soup.find_all('p', class_='description')
for desc in all_descriptions:
    print(desc.text)  # 출력: "Description 1"

3. select()

정의

  • CSS 선택자를 사용하여 조건에 맞는 모든 태그를 리스트로 반환합니다.
  • 보다 복잡한 조건을 간단히 처리할 수 있습니다.

예제

# 모든 <p> 태그 선택
all_p = soup.select('p')
for p in all_p:
    print(p.text)

# 출력:
# "Title 1"
# "Description 1"

# 특정 클래스 선택
title_p = soup.select('.title')
print(title_p[0].text)  # 출력: "Title 1"

# <div> 내부의 <p> 태그 선택
div_p = soup.select('div.content > p')
for p in div_p:
    print(p.text)

# 출력:
# "Title 1"
# "Description 1"

4. select_one()

정의

  • CSS 선택자를 사용하여 조건에 맞는 첫 번째 태그를 반환합니다.

예제

# 클래스가 'title'인 첫 번째 태그 선택
title_p = soup.select_one('.title')
print(title_p.text)  # 출력: "Title 1"

# <div> 내부의 첫 번째 <p> 태그 선택
first_div_p = soup.select_one('div.content > p')
print(first_div_p.text)  # 출력: "Title 1"

차이점 요약

find, find_all은 태그를 조건으로 select, select_one은 css 선택자를 이용한다. find_all, select는 반환값이 복수개를 가정해 사용하므로 리턴값은 리스트이다. 물론, 하나만 리턴하는 경우도 리스트를 반환하기 때문에 바로 text로 값을 확인할 수 없으므로 list[]형태로 값을 출력하도록 한다. 

find() 태그 조건 첫 번째 태그 (Tag) 단일 요소를 찾을 때 사용
find_all() 태그 조건 모든 태그의 리스트 (list[Tag]) 여러 요소를 찾을 때 사용
select() CSS 선택자 모든 태그의 리스트 (list[Tag]) 복잡한 CSS 조건의 다수 검색
select_one() CSS 선택자 첫 번째 태그 (Tag) 복잡한 CSS 조건의 단일 검색

정리

  • 단일 요소를 찾을 때: find, select_one
  • 다수의 요소를 찾을 때: find_all, select
  • 복잡한 선택 조건이 필요한 경우: select, select_one

적절한 메서드를 사용해 효율적으로 데이터를 추출할 수 있습니다. 😊

반응형

댓글