출처 : https://www.youtube.com/watch?v=HJcrD7Ukli4&t=33s

목차

  1. 준비 사항
  2. HTML 코드 작성
  3. Python 코드 작성
  4. CSS Selector 사용법
  5. Python으로 긁어온 데이터 엑셀에 저장

1. 준비 사항

모듈 설치

BeautifulSoup과 엑셀 저장을 위해 아래 두 가지 모듈을 설치해야 합니다.

pip install beautifulsoup4 openpyxl

2. HTML 코드 작성

BeautifulSoup을 활용해 데이터를 추출할 HTML 파일을 작성합니다. 이 예제에서는 CSS Selector를 설명하기 위한 간단한 페이지를 만듭니다.

HTML 파일 (index.html)

<!DOCTYPE html>
<html lang="ko">
<head>
    <style>
        body {background-color: black;}
        h1 {color: white;}
        ul {list-style: none;}
        .apple {color: pink;}
        .grape {color: purple;}
        .mango {color: yellow;}
        .banana {font-size: 30px;}
        .greenapple {color: green;}
    </style>
</head>
<body>
    <h1>CSS Selector</h1>
    <div id="site">
        <ul>
            <li><a class="apple" href="https://naver.com">네이버</a></li>
            <li><a class="grape" href="https://google.com">구글</a></li>
            <li><a class="mango" href="https://youtube.com">유튜브</a></li>
            <li><a class="greenapple" href="https://openai.com">OpenAI</a></li>
            <li><a class="greenapple" href="https://python.org">Python</a></li>
        </ul>
        <p class="apple">css selector를 설명하기 위한 페이지</p>
        <p class="apple banana">여기에는 두개의 클래스가 사용</p>
    </div>
</body>
</html>

이 HTML 코드는 CSS 스타일을 적용한 다양한 요소와 클래스를 포함하고 있어, 추후 BeautifulSoup을 사용해 CSS Selector로 데이터를 추출할 수 있습니다.


3. Python 코드 작성

BeautifulSoup을 활용한 CSS Selector 연습

이제 Python을 통해 HTML 파일을 읽어 들여, CSS Selector로 원하는 데이터를 추출하는 코드를 작성해 보겠습니다.

from bs4 import BeautifulSoup

# HTML 파일 경로 설정
url = r'D:/myStudy/beautifulsoupProject/index.html'

# HTML 파일 열기
html = open(url, encoding='utf-8')

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

#====[ select_one : 첫 번째 요소 선택 ]====
# h1 태그 선택
print(soup.select_one("h1"))

# ul 태그 선택
print(soup.select_one("ul"))

# id를 통해 선택 (#site)
print(soup.select_one("#site"))

# class를 통해 선택 (.apple)
print(soup.select_one(".apple"))

#====[ select : 여러 요소를 리스트로 반환 ]====
# class로 선택된 모든 요소 가져오기
print(soup.select(".apple"))

# html 태그 + class로 접근 (a.apple)
print(soup.select("a.apple"))

# p 태그 내 apple 클래스를 가진 요소
print(soup.select("p.apple"))

# 자손 접근: 띄어쓰기로 자손 선택 (#site 내의 li 요소)
print(soup.select("#site li"))

# 자식 접근: 바로 아래 자식 요소만 선택 (#site > li)
print(soup.select("#site > li"))

# 자손 접근 + class (자손 중 apple class)
print(soup.select("#site .apple"))

# a 태그의 apple class 만 찾기
print(soup.select("a[class=apple]"))

# a 태그면서 class가 'app'로 시작하는 요소 찾기
print(soup.select("a[class^=app]"))

# a 태그면서 class에 'app'이 포함된 요소 찾기
print(soup.select("a[class*=app]"))

# 클래스가 apple로 정확히 일치하는 요소 찾기
print(soup.select("[class=apple]"))

# href 속성이 .org로 끝나는 링크 찾기
print(soup.select("a[href$='.org']"))

# 두 개의 클래스를 가진 요소 찾기 (띄어쓰기 주의)
print(soup.select(".apple.banana"))

이 코드는 BeautifulSoup의 다양한 CSS Selector를 활용하여 HTML 요소를 선택하는 방법을 보여줍니다. 각 코드 블록을 실행하면서 출력 결과를 확인해 보세요.


4. CSS Selector 사용법 (보강된 내용)

CSS Selector 종류와 설명

  1. 태그로 선택: soup.select_one("h1")

    • HTML에서 특정 태그를 선택합니다. 위 코드에서는 첫 번째 h1 태그를 선택해 출력합니다.
  2. id로 선택: soup.select_one("#site")

    • id 값이 site인 요소를 선택합니다. id 선택자는 #을 사용하여 특정 id를 가진 요소를 찾아냅니다.
  3. class로 선택: soup.select_one(".apple")

    • class 값이 apple인 요소 중 첫 번째 요소를 선택합니다. class 선택자는 .을 사용합니다.
  4. 태그와 클래스 조합으로 선택: soup.select("a.apple")

    • a 태그 중에서 class가 apple인 요소만 선택합니다.
  5. 자손 접근: soup.select("#site li")

    • id가 site인 요소 내에 있는 모든 li 자손 요소를 선택합니다. 자손 선택은 부모와 자손 요소 사이에 띄어쓰기로 나타냅니다.
  6. 자식 접근: soup.select("#site > li")

    • id가 site인 요소 바로 아래 자식에 해당하는 li 태그들만 선택합니다. 자식 선택은 >을 사용해 표시합니다.
  7. 속성 선택: soup.select("[class=apple]")

    • class 속성이 정확하게 apple로 설정된 모든 요소를 선택합니다. 속성 선택자는 대괄호 [ ]를 사용해 속성과 값을 지정합니다.
  8. 속성 값으로 선택 (특정 문자열로 시작하는 속성): soup.select("a[class^=app]")

    • class 속성이 app으로 시작하는 모든 a 태그를 선택합니다. 이때 ^=는 "시작하는 값"을 의미합니다.
  9. 속성 값으로 선택 (특정 문자열을 포함하는 속성): soup.select("a[class*=app]")

    • class 속성에 app이 포함된 모든 a 태그를 선택합니다. *=는 "포함하는 값"을 의미합니다.
  10. 속성 값으로 선택 (특정 문자열로 끝나는 속성): soup.select("a[href$='.org']")

    • href 속성이 .org로 끝나는 모든 a 태그를 선택합니다. $=는 "끝나는 값"을 의미합니다.
  11. 여러 클래스 선택: soup.select(".apple.banana")

    • applebanana라는 두 개의 클래스를 동시에 가진 요소를 선택합니다. 클래스 사이에는 띄어쓰기가 아닌 .으로 연결합니다.
  12. 단어로 일치하는 속성 선택: soup.select("[class~=apple]")

    • class 속성 내에 정확히 apple이라는 단어가 포함된 요소를 선택합니다. 공백으로 구분된 여러 class 값 중에서 apple이 정확히 포함된 경우를 찾습니다.
  13. 자손 접근 + 클래스 선택: soup.select("#site .apple")

    • id가 site인 요소 내에서 class가 apple인 자손 요소를 모두 선택합니다.
  14. 자식 접근 + 클래스 선택: soup.select("#site > .apple")

    • id가 site인 요소 바로 아래에 위치한 자식 중에서 class가 apple인 요소를 선택합니다.

이로써 다양한 CSS Selector 사용법을 통해 HTML 요소를 세밀하게 선택할 수 있는 방법을 배웠습니다.


5. Python으로 긁어온 데이터 엑셀에 저장

BeautifulSoup으로 추출한 데이터를 엑셀 파일로 저장하는 방법을 소개합니다.

Python 코드 (엑셀에 데이터 저장)

import openpyxl

# 샘플 리스트 데이터
data = [
    ["이름", "나이", "직업"],
    ["홍길동", 30, "개발자"],
    ["김철수", 25, "디자이너"],
    ["이영희", 35, "매니저"]
]

# 새 워크북 생성
wb = openpyxl.Workbook()

# 활성화된 시트 선택
ws = wb.active

# 데이터를 시트에 입력
for row in data:
    ws.append(row)

# 엑셀 파일 저장
wb.save("sample_data.xlsx")

print("엑셀 파일이 생성되었습니다.")

위 코드는 샘플 데이터를 엑셀 파일로 저장하는 예제입니다. 이 코드를 실행하면 sample_data.xlsx 파일이 생성됩니다.


결론

이 강의를 통해 BeautifulSoup과 CSS Selector를 사용하여 HTML 파일에서 데이터를 추출하는 방법과, 추출한 데이터를 엑셀 파일로 저장하는 과정을 배웠습니다. 각 코드를 따라하며 결과를 확인해 보세요!

+ Recent posts