인공지능 데브코스 6기

[인공지능 데브코스 TIL] 0829 웹 스크래핑 기초 (2): BeautifulSoup4

비쵸비쵸비 2023. 9. 7. 14:56
728x90

프로그래머스 인공지능 데브코스 2주차 강의를 정리한 글입니다.


DOM (Document Object Model)

  • 웹 문서 (html)를 로드한 후, 파싱을 진행한 문서를 DOM이라고 한다.
  • 각 노드를 객체로 생각하면 문서를 더욱 편리하게 관리할 수 있다
  • 브라우저가 HTML을 DOM으로 바꾸는 이유
    1. 원하는 요소를 동적으로 변경해줄 수 있다.
    2. 원하는 요소를 쉽게 찾을 수 있다.

→ 우리는 파이썬으로 html을 파싱해줄 수 있는 HTML parser가 필요하다!

Beautiful Soup

  • HTML 코드를 분석해주는 HTML parser
import requests
res = requests.get("http://www.example.com")

# Beautiful Soup 불러오기
from bs4 import BeautifulSoup

soup = BeautifulSoup(res.text, "html.parser") # res.text를 파싱한 객체 생성
print(soup.prettify()) # 분석한 HTML을 보기 편하게 리턴

→ 들여쓰기가 포함되어 보기 편하게 출력된다.

이 파싱된 soup 객체를 통해 html의 요소들에 편하게 접근할 수 있다.

# html의 특정 요소들 가져오기
soup.title
soup.head
soup.body
, 등의 태그 속에 들어있는 text가 리턴된다.

특정 태그로 감싸진 요소를 찾기 위해서는 아래와 같이 find, find_all을 사용하고, 태그의 내용만 가져올 때는 .text를 사용한다.

# <h1> 태그로 감싸진 요소 하나 찾기
h1 = soup.find("hi")

# <p> 태그로 감싸진 요소들 찾기
soup.find_all("p") 

# 태그 이름 가져오기
h1.name

# 태그 내용 가져오기
h1.text
# 객체로 여러 번 접근할 수 있다.
soup.find("li","question-list-item").find("div","question").find("div","top").h4.text 

Beautiful Soup 실습

  • for loop로 모든 h3 태그 속 a 태그 가져오기
soup = BeautifulSoup(res.text, "html.parser")
h3_results = soup.find_all("h3")

for x in h3_results:
    print(x.a.text) # 태그를 객체처럼 사용할 수 있다

# 속성에도 딕셔너리처럼 접근 가능
for x in h3_results:
    print(x.a["title"])

HTML의 Locator로 원하는 요소 찾기

  • tagname: 태그의 이름
  • id: 하나의 고유 태그를 가리키는 라벨, 중복 없음
  • class: 여러 태그를 묶는 라벨

id없이 태그 이름으로만 검색하면 모든 태그들을 찾아온다.
→ id를 설정하면 내가 원하는 태그만 가져올 수 있다!

# id를 이용해서 가져오기
soup.find("div", id="results") # div태그의 results

# class를 이용해서 가져오기
soup.find("div", "page-header") 

📝참고: Pagenation

  • get으로 html 문서를 가져올 때 여러 페이지의 내용을 가져오고 싶은 경우 page={}.format()처럼 format문을 이용해서 가져올 수 있다.

    for i in range(1,5): # 1-4쪽
      res = requests.get("https://hashcode.co.kr/?page={}".format(i), user_agent)
      soup = BeautifulSoup(res.text, "html.parser")
      questions = soup.find_all("li","question-list-item")
728x90