CHHB stroy

🥣 BeautifulSoup: 2025 최신 가이드 본문

Python

🥣 BeautifulSoup: 2025 최신 가이드

CHHB 2025. 8. 6. 20:04

파이썬으로 웹 스크레이핑 시작하기!

웹스크레이핑 이미지

웹에서 정보를 한 번에 쏙! 뽑아오고 싶다면 바로 BeautifulSoup이 정답입니다 🥳
HTML이나 XML 문서를 파이썬 객체로 바꿔주고,
쉽고 직관적인 문법으로 필요한 데이터를 ‘쏙쏙’ 뽑아낼 수 있어요.

BeautifulSoup이 뭔가요?

  • 파이썬으로 HTML/XML 파싱 가능!
  • 트리 구조를 내 마음대로 탐색/수정!
  • 자동 인코딩 처리로 한글 걱정 NO!
  • 여러 파서(html.parser, lxml, html5lib) 지원 🚀
  • 오픈소스(MIT 라이센스)


🆕 최신 버전 & 설치 (2025)

  • 🏷️ 최신 버전: 4.13.4 (2025년 4월 15일 릴리스)
  • 🐍 지원 버전: Python 3.7+
  • 📦 설치 방법:
      pip install beautifulsoup4
      # 또는 lxml/html5lib 추가 설치
      pip install lxml html5lib
  • 🛠️ Debian/Ubuntu:
    apt-get install python3-bs4
  • 🌐 웹 요청엔 보통 requests도 같이 써요!
      pip install requests

🚀 기본 사용법: 10분 만에 마스터

from bs4 import BeautifulSoup

html_doc = """
<html><head><title>샘플 페이지</title></head>
<body>
  <p class="title"><b>샘플 이야기</b></p>
  <p class="story">옛날 옛적 세 자매가 있었습니다;
    <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
    <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>와
    <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
    가 우물 바닥에 살았습니다.</p>
  <p class="story">...</p>
</body>
</html>
"""
soup = BeautifulSoup(html_doc, 'html.parser')

print(soup.prettify())           # 예쁘게 출력!
print(soup.title.string)         # '샘플 페이지'
print(soup.p['class'])           # ['title']
for link in soup.find_all('a'):  # 링크 모두 뽑기
    print(link.get('href'))
print(soup.get_text())           # 전체 텍스트 한 번에!

💡 실전팁:

  • soup.title 처럼 ‘점’(dot) 접근으로 트리 탐색!
  • find_all('a'): 모든 <a> 태그 리스트로 한 번에!
  • get_text(): 태그 싹 빼고 텍스트만 추출!


🔎 find()와 find_all()로 원하는 데이터 뽑기

메서드 설명 결과 타입
find() 첫 번째로 만나는 요소 반환 단일 요소
find_all() 조건에 맞는 모든 요소 리스트 반환 리스트
import requests
from bs4 import BeautifulSoup

response = requests.get("https://quotes.toscrape.com")
soup = BeautifulSoup(response.text, "html.parser")

print(soup.find("div", class_="quote").text.strip())      # class로 찾기
print(soup.find("ul", id="menu").get_text(strip=True))    # id로 찾기
print(soup.find("a", string="Login")["href"])             # 텍스트로 찾기

quotes = soup.find_all("div", class_="quote")             # 모두 찾기
for q in quotes:
    print(q.get_text(separator=" ", strip=True))

🔥 꿀팁

  • class_="..." 처럼 class 뒤에 언더바 필수!
  • 여러 조건 조합도 attrs={...}로 가능!


🧩 파서 선택 가이드

파서 특징 설치방법
html.parser 기본 내장, 빠름, 간단 내장
lxml C로 빠름, HTML/XML 모두 지원 pip install lxml
html5lib 브라우저와 유사, 매우 관대(느림) pip install html5lib

😎 저는 보통 lxml + html.parser 조합으로 실전 사용!


☑️ 올바른 스크레이핑 습관

  • 🤖 robots.txt 확인: 허용범위 체크!
  • ⏲️ 요청 간 딜레이: time.sleep()으로 서버 배려!
  • 🕹️ 동적 사이트: JS 많은 사이트는 Selenium/Playwright도 고려!
  • ⚠️ 예외 처리: 네트워크/파싱 오류 try-except로 방어!
  • 📜 법적 이슈: 이용약관/저작권 준수는 필수!

🎁 한 줄 요약 & 느낀 점

🥣 BeautifulSoup은 웹 데이터 파싱의 ‘맛집’!

  • 초보도 쉽게 배우고, 실전에서 바로 써먹을 수 있다!
  • 본문 예제와 실전 팁 꼭 따라 해보세요.
  • 시행착오? 저도 class_ 빼먹고 몇 번 에러났답니다 😅


추가 참고자료:


😊 질문·피드백·경험담은 댓글로 언제든 환영합니다!