ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BeautifulSoup으로 데이터 추출하기
    IT - 프로그래밍/파이썬 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파싱 #데이터분석 #크롤링 #파이썬강의 #프로그래밍 #데이터수집

    반응형
Designed by Tistory.