BeautifulSoup이란?

  • 파이썬으로 스크레이핑을 할 수 있게 해주는 라이브러리
  • 간단하게 HTML, XML에서 정보를 추출할 수있다.

 

BeautifulSoup 설치하기

pip3 install beautifulsoup4

 

 

BeautifulSoup 기본 사용법

from bs4 import BeautifulSoup

# 분석하고 싶은 HTML
html = """
<html><body>
    <h1>스크레이핑이란?</h1>
    <p>웹 페이지를 분석하는 것</p>
    <p>원하는 부분을 추출하는 것</p>
</body></html>
"""

# HTML 분석하기
soup = BeautifulSoup(html, 'html.parser')
#                    ↳분석할 html, ↳ html분석할때는 html.parser 적기


# 원하는 부분 추출하기
h1 = soup.html.body.h1
p1 = soup.html.body.p
#         ↱</p>뒤에 있는 공백 or 줄바꿈이 추출
p2 = p1.next_sibling.next_sibling
#                     ↳한 번 더 사용해서 2번째 <p>태그 추출

# 요소의 글자 출력하기
print("h1-> ", h1.string)
print("p1-> ", p1.string)
print("p2-> ", p2.string)

 

 

id 요소를 찾는 방법 - find()사용

from bs4 import BeautifulSoup

# 분석하고 싶은 HTML
html = """
<html><body>
    <h1 id="title">스크레이핑이란?</h1>
    <p id="body">웹 페이지를 분석하는 것</p>
    <p>원하는 부분을 추출하는 것</p>
</body></html>
"""

# HTML 분석하기
soup = BeautifulSoup(html, 'html.parser')
#                    ↳분석할 html, ↳ html분석할때는 html.parser 적기


# find 메서드로 원하는 부분 추출하기
title = soup.find(id="title")
body = soup.find(id="body")

# 텍스트 부분 출력하기
print("id가 title-> ", title.string)
print("id가 body-> ", body.string)

 

여러 개의 요소 추출하기 - find_all()

from bs4 import BeautifulSoup

# 분석하고 싶은 HTML
html = """
<html><body>
    <ul>
        <li><a href="http://www.naver.com">naver</a></li>
        <li><a href="http://www.daum.net">daum</a></li>
    </ul>
</body></html>
"""

# HTML 분석하기
soup = BeautifulSoup(html, 'html.parser')
#                    ↳분석할 html, ↳ html분석할때는 html.parser 적기


# find_all() 메서드로 추출하기
links = soup.find_all("a")

# 링크목록 출력하기
for a in links:
    href = a.attrs['href']  # a 태그의 속성 중 href 값 추출
    text = a.string         # a 태그의 텍스트 추출
    print(text, " 링크-> ", href)

 


DOM 요소의 속성에 대해

  • DOM(Document Object Model) -> XML 또는 HTML의 요소에 접근하는 구조를 나타낸다.
  • DOM 요소의 속성이란 -> 태그 이름 뒤에 있는 각 속성을 말함
    (예: <a>태그라면 href 등이 속성이다)
from bs4 import BeautifulSoup

soup = BeautifulSoup(
    "<p><a href='www.naver.html'>test</a></p>",

    "html.parser")

print(soup.prettify())
print()

a = soup.p.a
print("soup.p.a -> ", a)

# attrs 속성의 자료형 확인
print("type(a.attrs) -> ", type(a.attrs))

# href 속성이 있는지 확인하기
print("'href' in a.attrs -> ", 'href' in a.attrs)

# href 속성값 확인하기
print("a['href'] -> ", a['href'])

 

 


urlopen()과 BeautifulSoup 조합하기

from bs4 import BeautifulSoup
import urllib.request as req

# 기상청 RSS에서 xml 데이터 추출

url = "http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp"

# urlopen()으로 데이터 가져오기
res = req.urlopen(url)

# BeautifulSoup으로 분석
soup = BeautifulSoup(res, "html.parser")

# 원하는 데이터 추출하기
title = soup.find("title").string
wf = soup.find("wf").string
print("title -> ", title)
print("wf -> ", wf)

 

 


CSS 선택자 사용하기

  • soup.select_one(<선택자>)   :  css 선택자로 요소 하나를 추출
  • soup.select(<선택자>)  :  css 선택자로 요소 여러 개를 리스트로 추출
from bs4 import BeautifulSoup

# 분석 대상 HTML

html = """
<html><body>
<div id="meigen">
  <h1>위키북스 도서</h1>
  <ul class="items1">
    <li>유니티 게임 이펙트 입문</li>
    <li>스위프트로 시작하는 아이폰 앱 개발 교과서</li>
    <li>모던 웹사이트 디자인의 정석</li>
  </ul>
</div>
</body></html>
"""


# HTML 분석하기
soup = BeautifulSoup(html, 'html.parser')


# 필요한 부분을 css 쿼리로 추출하기
# 타이틀 부분 추출하기
h1 = soup.select_one("div#meigen > h1").string
print("h1 -> ", h1)
print()

# 목록 부분 추출하기
li_list = soup.select("div#meigen > ul.items1 > li")
for i in li_list:
    print("li -> ", i.string)

 

 

 


네이버 금융에서 환율 정보 추출하기

from bs4 import BeautifulSoup
import urllib.request as req

# HTML 가져오기
url = "https://finance.naver.com/marketindex/"
res = req.urlopen(url)

# HTML 분석하기
soup = BeautifulSoup(res, "html.parser")

# 원하는 데이터 추출하기
price = soup.select_one("div.head_info > span.value").string
print("usd/krw -> ", price)

 

'머신러닝 > 1.크롤링과 스크레이핑' 카테고리의 다른 글

1-3 CSS 선택자  (0) 2021.06.09
1-1 데이터 다운로드하기  (0) 2021.06.06

+ Recent posts