🖥️ IT, 컴퓨터/🐍 Python

[Python] BeautifulSoup 라이브러리란? :: html 파싱, Selenium과의 차이

김 홍시 2024. 11. 20.
반응형

BeautifulSoup이란?

BeautifulSoup은 Python을 사용하여 HTML 및 XML 문서를 쉽게 파싱(parsing)할 수 있게 해주는 라이브러리입니다. 웹 스크래핑을 할 때 자주 사용되며, 문서의 구조를 탐색하고 원하는 데이터를 추출하기 위해 HTML 요소를 검색하거나 조작할 수 있습니다.


주요 특징

  1. 간단한 사용법: HTML과 XML 파일을 Python 객체로 변환하여 간편하게 데이터에 접근할 수 있도록 도와줍니다.
  2. 다양한 파서 지원:
    • 기본적으로 Python 표준 라이브러리의 html.parser를 사용합니다.
    • 더 빠른 파싱 속도를 원할 경우 lxml이나 html5lib를 사용할 수 있습니다.
  3. 유연한 탐색 기능:
    • 태그, 속성, 텍스트 등을 기반으로 요소를 찾고 필터링할 수 있습니다.
  4. 문서 복구 기능:
    • 손상된 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 주요 메서드

  1. 객체 탐색
    • find(name, attrs, ...): 조건에 맞는 첫 번째 태그 반환
    • find_all(name, attrs, ...): 조건에 맞는 모든 태그 리스트 반환
    • select(css_selector): CSS 선택자를 사용하여 태그 선택
  2. 문서 내비게이션
    • .parent: 현재 태그의 부모 태그 반환
    • .children: 현재 태그의 자식 태그 반환 (iterable)
    • .next_sibling: 다음 형제 태그 반환
    • .previous_sibling: 이전 형제 태그 반환
  3. 데이터 추출
    • .text: 태그 내부의 텍스트 반환
    • .attrs: 태그의 속성을 딕셔너리 형태로 반환

BeautifulSoup 활용 팁

  1. 파서 선택
    • 기본 html.parser는 속도가 느릴 수 있으므로 lxml 사용을 추천합니다.
    • 예: BeautifulSoup(html, "lxml")
  2. 정규식 활용
    • 태그 이름이나 속성이 동적으로 변경될 경우 re 라이브러리를 함께 사용합니다.
      import re
      soup.find("a", href=re.compile(r"example"))
  3. 크롤링 시 주의점
    • HTTP 요청을 위해 requests와 함께 사용하며, 서버 로드나 법적 문제를 피하기 위해 크롤링 속도를 조정합니다.
    • 예: time.sleep()을 활용하여 요청 간격을 둡니다.
  4. 동적 웹사이트
    • 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 설치 필요

 

 

 

 

반응형

댓글