반응형
BeautifulSoup이란?
BeautifulSoup은 Python을 사용하여 HTML 및 XML 문서를 쉽게 파싱(parsing)할 수 있게 해주는 라이브러리입니다. 웹 스크래핑을 할 때 자주 사용되며, 문서의 구조를 탐색하고 원하는 데이터를 추출하기 위해 HTML 요소를 검색하거나 조작할 수 있습니다.
주요 특징
- 간단한 사용법: HTML과 XML 파일을 Python 객체로 변환하여 간편하게 데이터에 접근할 수 있도록 도와줍니다.
- 다양한 파서 지원:
- 기본적으로 Python 표준 라이브러리의
html.parser
를 사용합니다. - 더 빠른 파싱 속도를 원할 경우
lxml
이나html5lib
를 사용할 수 있습니다.
- 기본적으로 Python 표준 라이브러리의
- 유연한 탐색 기능:
- 태그, 속성, 텍스트 등을 기반으로 요소를 찾고 필터링할 수 있습니다.
- 문서 복구 기능:
- 손상된 HTML 문서도 복구하여 파싱할 수 있습니다.
설치
BeautifulSoup은 Python 라이브러리 bs4
로 설치됩니다.
pip install beautifulsoup4
HTML 파서를 위해 lxml
이나 html5lib
설치를 권장합니다.
pip install lxml html5lib
기본 사용법
1. HTML 파싱
from bs4 import BeautifulSoup
# HTML 문자열 샘플
html = """
<html>
<head><title>Test Page</title></head>
<body>
<h1>Welcome to BeautifulSoup</h1>
<p class="content">This is a test page.</p>
<a href="https://example.com">Visit Example</a>
</body>
</html>
"""
# BeautifulSoup 객체 생성
soup = BeautifulSoup(html, "html.parser")
# 문서 구조 탐색
print(soup.title.text) # 출력: Test Page
print(soup.find("h1").text) # 출력: Welcome to BeautifulSoup
print(soup.find("p", class_="content").text) # 출력: This is a test page.
2. 태그 탐색 및 데이터 추출
- 태그 찾기:
find()
,find_all()
- 속성 접근: 딕셔너리 스타일로 속성 값 접근
# 단일 태그 찾기
print(soup.find("a")["href"]) # 출력: https://example.com
# 여러 태그 찾기
links = soup.find_all("a")
for link in links:
print(link["href"])
3. CSS 선택자 사용
# CSS 선택자 기반 요소 선택
print(soup.select_one("p.content").text) # 특정 클래스 선택
print(soup.select("a")) # 모든 <a> 태그 선택
BeautifulSoup 주요 메서드
- 객체 탐색
find(name, attrs, ...)
: 조건에 맞는 첫 번째 태그 반환find_all(name, attrs, ...)
: 조건에 맞는 모든 태그 리스트 반환select(css_selector)
: CSS 선택자를 사용하여 태그 선택
- 문서 내비게이션
.parent
: 현재 태그의 부모 태그 반환.children
: 현재 태그의 자식 태그 반환 (iterable).next_sibling
: 다음 형제 태그 반환.previous_sibling
: 이전 형제 태그 반환
- 데이터 추출
.text
: 태그 내부의 텍스트 반환.attrs
: 태그의 속성을 딕셔너리 형태로 반환
BeautifulSoup 활용 팁
- 파서 선택
- 기본
html.parser
는 속도가 느릴 수 있으므로lxml
사용을 추천합니다. - 예:
BeautifulSoup(html, "lxml")
- 기본
- 정규식 활용
- 태그 이름이나 속성이 동적으로 변경될 경우
re
라이브러리를 함께 사용합니다.import re soup.find("a", href=re.compile(r"example"))
- 태그 이름이나 속성이 동적으로 변경될 경우
- 크롤링 시 주의점
- HTTP 요청을 위해
requests
와 함께 사용하며, 서버 로드나 법적 문제를 피하기 위해 크롤링 속도를 조정합니다. - 예:
time.sleep()
을 활용하여 요청 간격을 둡니다.
- HTTP 요청을 위해
- 동적 웹사이트
- BeautifulSoup은 정적 HTML만 처리할 수 있습니다. JavaScript로 동적으로 생성되는 콘텐츠는 Selenium 같은 도구와 함께 사용해야 합니다.
예제: 웹 스크래핑
특정 뉴스 웹사이트의 기사 제목 스크래핑
import requests
from bs4 import BeautifulSoup
# 웹 페이지 요청
url = "https://news.ycombinator.com/"
response = requests.get(url)
# BeautifulSoup 객체 생성
soup = BeautifulSoup(response.text, "html.parser")
# 기사 제목 가져오기
titles = soup.select(".storylink")
for idx, title in enumerate(titles, 1):
print(f"{idx}: {title.text}")
동적으로 생성된 데이터 처리
동적 데이터를 포함한 웹사이트의 경우 Selenium과 BeautifulSoup을 조합하여 사용합니다.
from selenium import webdriver
from bs4 import BeautifulSoup
# Selenium으로 페이지 로드
driver = webdriver.Chrome()
driver.get("https://example.com")
# BeautifulSoup으로 파싱
html = driver.page_source
soup = BeautifulSoup(html, "html.parser")
print(soup.title.text)
driver.quit()
BeautifulSoup의 장단점
장점
- 가벼우며 사용법이 직관적입니다.
- 다양한 파서 지원으로 유연성 제공.
- HTML 구조를 효율적으로 탐색 가능.
단점
- 동적 웹사이트의 경우 한계가 있음.
- 속도가 Selenium보다 빠르지만, 정교한 웹 자동화에는 부적합.
BeautifulSoup vs Selenium 비교
특징 | BeautifulSoup | Selenium |
---|---|---|
사용 목적 | 정적 HTML 파싱 및 데이터 추출 | 브라우저 자동화 및 동적 콘텐츠 처리 |
속도 | 빠름 | 느림 |
동적 콘텐츠 | 지원하지 않음 (JavaScript 처리 불가) | 지원 (실제 브라우저 동작) |
주요 활용 | 웹 크롤링, 데이터 수집 | 웹 테스트, 동적 웹사이트 데이터 추출 |
설치 요구사항 | 간단 (BeautifulSoup + requests) | 추가적인 WebDriver 설치 필요 |
반응형
'🖥️ IT, 컴퓨터 > 🐍 Python' 카테고리의 다른 글
[IT] Python과 Google Map API를 이용해 경위도 좌표를 영문 주소로 변환 (0) | 2025.01.17 |
---|---|
[Python] matplotlib으로 인구 피라미드 시각화하기 (0) | 2024.12.24 |
[Python] Selenium 라이브러리란? :: 크롤링, 웹스크래핑 (0) | 2024.11.20 |
[Python] 파이썬 BeautifulSoup 뷰티풀수프로 html 파싱해 원하는 부분 표로 만들기 :: 공차 매장명, 주소 추출 (0) | 2024.11.17 |
[Python] geopandas이용하여 shp파일 단순화하기 :: simplify (0) | 2024.11.13 |
댓글