본문 바로가기

머신러닝 딥러닝 입문

[Jupyter Notebook / BeautifulSoup] 데이터 스크래핑

www.yes24.com/Product/Goods/42496558

 

파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문

BeautifulSoup, scikit-learn, TensorFlow를 사용하여 실무에 머신러닝/딥러닝을 적용해 보자!인공지능, 머신러닝, 딥러닝은 바둑, 의료, 자동차 등 이미 다양한 분야에서 성공적인 성과를 보여주고 있다. ��

www.yes24.com

블로그의 모든 내용은 해당 책을 읽고 포스팅하는 내용입니다!

 

BeautifulSoup를 이용해 데이터를 스크래핑 해보자. (기초!)

 


BeautfulSoup 설치

 

anaconda Prompt를 켜고, " pip3 install beautifulsoup4 "를 입력해주자. 내 껀 이미 설치되어 있는듯..

pip3 install beautifulsoup4

 

그리고 막상 실행해보면 bs4를 찾을 수 없다고 한다. 설치해주자. " pip install bs4 "를 입력해주자.

???
pip install bs4


우선 HTML을 문자열로 만들어, 파싱하는 방법을 배워보자.

 

from bs4 import BeautifulSoup
html = """
<html><body>
    <h1>스크레이핑이란?</h1>
    <p>웹 페이지를 분석!</p>
    <p>원하는 부분 추출!</p>
</body></html>
"""
soup = BeautifulSoup(html, 'html.parser')
h1 = soup.html.body.h1
p1 = soup.html.body.p
p2 = p1.next_sibling.next_sibling
print("h1 = ",h1.string)
print("p = ",p1.string)
print("p = ",p2.string)

BeautifulSoup 객체를 만들 때, 첫 번째 매개변수에는 html을 넣어주고, 두 번째 매개변수에는 분석할 매개변수의 종류를 지정한다. 여기에서는 html을 직접 문자열로 만들어 넣었다.

 

대락 html의 구조를 이용해 원하는 요소를 추출할 수 있다라는 것을 알고 넘어가면 될 듯.

 

실행 화면


이번에는 find_all()을 이용해 여러 개의 태그를 한번에 추출해 보자. 마찬가지로 직접 html을 문자열로 만들어 사용한다.

 

from bs4 import BeautifulSoup
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>
"""
soup = BeautifulSoup(html, "html.parser")
links = soup.find_all("a")
for a in links:
    href = a.attrs['href']
    text = a.string
    print(text, ">", href)

find_all 메소드를 이용해 <a>태그를 모두 추출한다. 그리고 모든 원소에 대해 attrs['href']를 이용해, attrs 속성에서 href 속성을 추출한다고 하는데,, 사실 무슨 말인지 잘 와닿진 않는다. 아무든 href="링크" 의 링크 스트링을 추출할 수 있는 것 같다.

 

실행 화면


DOM = Document Object Model : XML 또는 HTML의 요소에 접근하는 구조

DOM 요소의 속성 : 태그 이름 뒤에 있는 속성 (ex) 위 예시에서 <a> 태그 뒤의 href )

이 DOM 요소의 속성을 추출해보자.

 

한 줄씩 실행해보자

위의 코드에서 알 수 있듯이, prettify() 메소드를 이용해 soup이 정상적으로 분석을 진행했는지 확인 할 수 있다.

soup.p.a를 확인에 <p>로, <a>로 접근해서 변수 a에 태그 <a>를 할당하는 것 같다.

a.attrs의 타입은 dict 타입이고, 해당 dict 안에 'href'(DOM 요소)가 있다.


urlopen()과 조합해서 전의 기상청 RSS 내용을 추출해보자.

 

from bs4 import BeautifulSoup
import urllib.request as req
url = "http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp"
res = req.urlopen(url)
soup = BeautifulSoup(res, "html.parser")
title = soup.find("title").string
wf = soup.find("wf").string
print(title)
print(wf)

soup까지는 전과 같은 내용이지만, find 메소드를 이용해 title과 wf 태그를 추출한 내용. 실행 결과는 다음과 같다.

 

실행 결과


CSS 선택자 사용하기?

soup.select_one(<a>)는 요소 하나.

soup.select(<a>)는 요소 여러개를 리스트로 추출.

 

from bs4 import BeautifulSoup
html = """
<html><body>
<div id = "meigen">
    <h1>위키북스 도서</h1>
    <ul class="items">
     <li>유니티 게임 이펙트 입문</li>
     <li>으아아아아아아아</li>
     <li>우오오오오오오오</li>
    </ul>
</div>
</body></html>
"""
soup = BeautifulSoup(html, "html.parser")
h1 = soup.select_one("div#meigen > h1").string
print("h1= "+h1)
li_list = soup.select("div#meigen > ul.items > li")
for li in li_list:
    print("li =", li.string)

h1에서 볼 수 있듯이, h1에 해당하는 요소 하나를 h1에 저장하고, div > ul > li에 해당하는 모든 요소를 리스트에 저장한다.

 

실행 결과