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 |