상세 컨텐츠

본문 제목

BeautifulSoup으로 데이터 추출하기

IT - 프로그래밍/파이썬

by 파란 호랑 2025. 4. 26. 11:00

본문

반응형

웹 스크래핑(Web Scraping)을 통해 데이터를 가져오려면 HTML 구조를 이해하고 원하는 정보를 추출하는 방법을 알아야 합니다.
Python의 BeautifulSoup 라이브러리를 활용하면 웹페이지에서 손쉽게 데이터를 추출할 수 있습니다.


이 글에서는 HTML 기본 구조와 BeautifulSoup을 이용한 데이터 추출 방법을 단계별로 설명하겠습니다.

HTML 기본 구조 이해하기

페이지는 보통 HTML(HyperText Markup Language) 형식으로 작성됩니다. 아래는 기본적인 HTML 문서 구조입니다.

<!DOCTYPE html>
<html>
<head>
    <title>예제 웹페이지</title>
</head>
<body>
    <h1>안녕하세요, 웹 스크래핑!</h1>
    <p class="description">이 페이지는 웹 스크래핑 예제입니다.</p>
    <a href="https://example.com">Example 사이트</a>
</body>
</html>

<h1>, <p> 태그: 문서의 제목과 문단을 정의
class="description": 특정 요소를 구별하는 클래스 속성
<a href="URL">: 링크(Anchor) 태그

웹 스크래핑을 할 때는 원하는 데이터가 어떤 HTML 태그 안에 위치하는지 파악하는 것이 중요합니다.

BeautifulSoup 설치

BeautifulSoup은 Python에서 HTML 문서를 쉽게 분석하고 필요한 데이터를 추출할 수 있도록 도와주는 라이브러리입니다.
설치 방법은 아래와 같습니다:

pip install beautifulsoup4
BeautifulSoup으로 HTML 데이터 파싱하기

BeautifulSoup을 사용하여 HTML 문서를 로드하고 분석하는 기본 과정을 살펴보겠습니다.

from bs4 import BeautifulSoup

html = """
<html>
<head><title>웹 스크래핑 예제</title></head>
<body>
    <h1>안녕하세요, 웹 스크래핑!</h1>
    <p class="description">이 페이지는 웹 스크래핑 예제입니다.</p>
    <a href="https://example.com">Example 사이트</a>
</body>
</html>
"""

# BeautifulSoup 객체 생성
soup = BeautifulSoup(html, "html.parser")

# HTML 구조 출력
print(soup.prettify())  # 들여쓰기된 형태로 출력

BeautifulSoup(html, "html.parser") → HTML 문서를 파싱(분석)
soup.prettify() → HTML 코드를 보기 좋게 출력한다

특정 태그 선택 및 내용 가져오기

BeautifulSoup을 사용하면 특정 HTML 태그의 내용을 쉽게 가져올 수 있습니다.

제목(h1) 태그 가져오기

print(soup.h1.text)  # "안녕하세요, 웹 스크래핑!"

soup.h1 → 첫 번째 <h1> 태그 선택
.text → 태그 내부 텍스트만 출력

특정 태그(class) 가져오기

print(soup.find("p", class_="description").text)

soup.find("p", class_="description") → class="description"인 <p> 태그 찾기

링크(a) 태그에서 URL 가져오기

link = soup.find("a")  # 첫 번째 <a> 태그 찾기
print(link["href"])  # "https://example.com"

link["href"] → <a> 태그의 href 속성 값 가져오기

여러 개의 요소 가져오기 (find_all)

find_all() 을 사용하면 특정 태그를 모두 가져올 수 있습니다.

html = """
<ul>
    <li>Python</li>
    <li>Java</li>
    <li>C++</li>
</ul>
"""

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

# 모든 <li> 태그 가져오기
items = soup.find_all("li")

for item in items:
    print(item.text)

soup.find_all("li") → 모든 <li> 태그 리스트 반환
.text → 태그 내부 텍스트만 출력

출력 결과

Python
Java
C++

CSS 선택자로 요소 선택하기 (select())

select() 메서드를 사용하면 CSS 선택자를 활용하여 특정 요소를 찾을 수 있습니다.

html = """
<div class="container">
    <p class="text">첫 번째 문장</p>
    <p class="text">두 번째 문장</p>
</div>
"""

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

# CSS 선택자로 <p> 태그 찾기
paragraphs = soup.select(".container .text")

for p in paragraphs:
    print(p.text)

.container .text → class="container" 내부의 class="text" 태그 선택

출력 결과

첫 번째 문장
두 번째 문장

실전 예제 – 웹페이지에서 데이터 가져오기

이제 실제 웹사이트에서 데이터를 가져오는 예제를 만들어 보겠습니다.

import requests
from bs4 import BeautifulSoup

# 웹페이지 요청
url = "https://news.ycombinator.com/"
response = requests.get(url)

# BeautifulSoup 객체 생성
soup = BeautifulSoup(response.text, "html.parser")

# 기사 제목 가져오기
titles = soup.find_all("a", class_="storylink")

for i, title in enumerate(titles[:5]):  # 상위 5개 뉴스 출력
    print(f"{i+1}. {title.text} ({title['href']})")

requests.get(url) → 웹페이지 HTML 가져오기
soup.find_all("a", class_="storylink") → 뉴스 제목 추출

결론 및 정리

✔ HTML 구조를 이해하면 웹 데이터 추출이 쉬워진다!
✔ BeautifulSoup은 웹 스크래핑에 필수적인 강력한 라이브러리다
✔ find() / find_all() / select() 를 활용하여 원하는 데이터 선택 가능
✔ 실제 웹사이트에서 뉴스 제목, 가격, 리뷰 등 다양한 데이터 추출 가능

이제 BeautifulSoup을 활용하여 원하는 웹 데이터를 직접 추출해 보세요!

#웹스크래핑 #Python #BeautifulSoup #HTML파싱 #데이터분석 #크롤링 #파이썬강의 #프로그래밍 #데이터수집

728x90
반응형

관련글 더보기