티스토리 뷰
[빅데이터] 파이썬으로 HTML 문서 데이터 추출하기
0. 파싱이란?
1. 데이터 추출하기 - Beautifulsoup 라이브러리
2. 웹 페이지에서 원하는 데이터 추출하기
3. HTML 문서 작성해서 데이터 추출해보기 - 1
4. HTML 문서 작성해서 데이터 추출해보기 - 2
5. HTML 문서 작성해서 데이터 추출해보기 - 3
0. 파싱이란?
쉽게 말해서 주어진 데이터를 파서를 이용해 의미있는 데이터로 추출하는 행위를 말한다.
1. Beautifulsoup 라이브러리
HTML 등의 컨텐츠를 사용자가 파싱할 수 있도록 도와주는 라이브러리이다.
파이썬으로 해당 라이브러리를 사용하기 위해서는 설치가 필요하다.
파이참 하단에 Terminal 창에 명령어를 입력해준다.
pip install Beautifulsoup
2. 웹 페이지에서 원하는 데이터 추출하기
예를 들어, 미국 환율을 추출해본다고 하자.
Chrome 브라우저에 접속해서 https://finance.naver.com/marketindex/
에 들어간다. F12를 눌러 개발 도구를 띄운다.
노란색으로 표시된 부분을 눌러서
클릭을 하면
HTML 문서에 해당하는 부분이 표시가 된다.
오른쪽 버튼을 눌러 Copy selector를 한다.
#exchangeList > li.on > a.head.usd > div > span.value
이런 값이 나온다.
파이썬을 열어 코드를 작성한다.
from bs4 import BeautifulSoup
import urllib.request as req # 특정 웹사이트로 접속하기 위해
url = "http://info.finance.naver.com/marketindex/"
res = req.urlopen(url).read()
soup = BeautifulSoup(res, 'html.parser') #분석 용이하게 파싱
print(soup)
결과 값으로 해당 HTML 문서가 출력된다.
복사해둔 selector 값으로 특정한 데이터인 환율을 추출하기 위한 코드는 다음과 같다.
from bs4 import BeautifulSoup
import urllib.request as req # 특정 웹사이트로 접속하기 위해
url = "http://info.finance.naver.com/marketindex/"
res = req.urlopen(url).read()
soup = BeautifulSoup(res, 'html.parser') #분석 용이하게 파싱
p = soup.select_one("#exchangeList > li.on > a.head.usd > div > span.value").string
#실행할 때마다 새로운 정보 반영 String 붙이면 순수한 값만 추출됨
print("usd/krw =", p)
출력된 결과 :
C:\Users\403-30\PycharmProjects\untitled1\venv\Scripts\python.exe C:/Users/403-30/PycharmProjects/untitled1/test1.py
usd/krw = 1,119.00
Process finished with exit code 0
값이 변동되었다면 다시 실행했을 때 변동된 값으로 출력된다.
3. HTML 문서 작성해서 데이터 추출해보기 - 1
파이썬에 다음과 같이 간단한 HTML 문서를 작성한다.
html = """
<html><body>
<div id ="test">
<h1>빅데이터 분석</h1>
<ul class="lec">
<li>파이썬</li>
<li>머신러닝</li>
<li>통계분석</li>
</ul>
</div>
</body></html>
"""
soup = BeautifulSoup(html, 'html.parser')
print(soup)
이 코드를 실행하면 전체 HTML 문서가 출력된다.
3-1. h1 태그 추출
res = soup.select_one("#test > h1")
print(res)
결과 값은
<h1>빅데이터 분석</h1>
이다.
태그를 제외한 결과를 얻고 싶다면,
res = soup.select_one("#test > h1").string
뒤에 string을 붙여주면 된다.
예시로 작성한 HTML 문서에 h1 태그가 하나 뿐이므로
res = soup.select_one("h1").string
이렇게 작성해도 같은 결과가 나온다.
그 밖에도
res = soup.select_one("body > div#test > h1").string
res = soup.select_one("html > body > div#test > h1").string
상위 태그부터 모두 작성하여도 같은 결과가 나온다.
여기서 #은 태그의 아이디를 의미하는 것이고, >는 상위 태그와 하위 태그를 구분하는 구분자다.
띄어쓰기를 제대로 해서 작성해야 한다.
3-2. '파이썬'만 추출
res = soup.select_one("div#test > ul.lec > li").string #파이썬만 추출되는 것을 확인
res = soup.select_one("li").string # 파이썬만 추출
res = soup.li.string #파이썬
next_sibling을 이용하면 그 다음 태그에 접근이 가능하다.
res = soup.select_one("li") # 파이썬만 추출
res2 = res.next_sibling.next_sibling
res3 = res2.next_sibling.next_sibling
print(res.string)
print(res2.string)
print(res3.string)
출력 결과는
파이썬
머신러닝
통계분석
3-3. '파이썬' '머신러닝' '통계분석' 출력
mylist = soup.select("div#test > ul.lec > li")
for li in mylist:
print(li.string)
select 함수를 사용하면 리턴값이 리스트다.
for문을 이용해 li 태그의 값들을 모두 출력한다.
print(soup.select_one("li").string) # 파이썬
print(soup.select_one("li:nth-of-type(1)").string) # 파이썬
print(soup.select_one("li:nth-of-type(2)").string) # 머신러닝
print(soup.select_one("li:nth-of-type(3)").string) # 통계분석
a1 = "li:nth-of-type("
a2 = ")"
for i in range (len(soup.select("li"))):
ves = a1+str(i+1)+a2
print(soup.select_one(ves).string)
4. HTML 문서 작성해서 데이터 추출해보기 - 2
프로젝트에 HTML 새 파일을 작성한다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="main-goods">
<h1>과일과 야채</h1>
<ul id="fr-li">
<li class="red green" data-lo="ko">사과</li>
<li class="pupple" data-lo="us">포도</li>
<li class="yellow" data-lo="us">레몬</li>
<li class="yellow" data-lo="ko">오렌지</li>
</ul>
<ul id="ve-list">
<li class="white green" data-lo="ko">무</li>
<li class="red green" data-lo="us">파프리카</li>
<li class="black" data-lo="ko">가지</li>
<li class="black" data-lo="us">아보카도</li>
<li class="white" data-lo="cn">연근</li>
</ul>
</div>
</body>
</html>
4-1. class=black인 데이터만 추출
class 속성의 id는 . 으로 접근한다.
fp = open("fruit.html", mode="r", encoding="utf-8")
soup = BeautifulSoup(fp, "html.parser")
print(soup.select("#ve-list > li[class='black']"))
print(soup.select("#ve-list > li.black"))
[<li class="black" data-lo="ko">가지</li>, <li class="black" data-lo="us">아보카도</li>]
[<li class="black" data-lo="ko">가지</li>, <li class="black" data-lo="us">아보카도</li>]
4-2 .ve-list에서 date-lo="us"인 데이터만 추출하기
# 출력되는 모든 결과가 길이가 1인 리스트로 출력된다. 모든 요소가 하나의 데이터임
print(soup.select("#ve-list > li[data-lo='us']")) # 따옴표 유의해서 사용하기. 짝을 잘 지어야 함
# html class : 의미가 특별히 지정된 속성, data-lo는 사용자가 필요에 의해 생성한 속성
[<li class="red green" data-lo="us">파프리카</li>, <li class="black" data-lo="us">아보카도</li>]
4-3. 딕셔너리를 이용해서 조건에 해당하는 데이터 추출
li 태그에서 cond에 기술된 조건을 만족하는 태그를 찾아라
cond={"data-lo":"us", "class":"black"}
print(soup.find("li", cond))
5. HTML 문서 작성해서 데이터 추출해보기 - 3
프로젝트에 새로운 HTML 문서를 작성한다.
<ul id="mycolor">
<li id="re">Red</li>
<li id="bl">Blue</li>
<li id="ye">Yellow</li>
<li id="gr">Gray</li>
<li id="pi">Pink</li>
</ul>
5-1. Gray를 추출할 수 있는 다양한 방법들
from bs4 import BeautifulSoup
fp = open("color.html", encoding="utf-8")
soup=BeautifulSoup(fp, "html.parser")
print(soup.select_one("#gr").string)
sel = lambda q: print(soup.select_one(q).string)
sel("#gr")
sel("li#gr")
sel("ul > li#gr")
sel("#mycolor #gr")
sel("#mycolor > #gr") #조금 더 명시적으로
sel("ul#mycolor > li#gr")
sel("li") # 결과 : Red 맨 처음 만나게 되는 태그를 출력
sel("li[id='gr']")
sel("li:nth-of-type(4)")
'기타' 카테고리의 다른 글
레토 노트북 쿨러 받침대 LCS-S01 구매 후기 (0) | 2018.07.27 |
---|---|
유클리드 알고리즘 - 최대공약수, 최소공배수 구하기 (0) | 2018.04.10 |
- Total
- Today
- Yesterday
- 자바
- world wide web
- outer join
- 글자수세기프로그램
- 오라클 집계함수
- JavaFX
- 별찍기예제
- 자바글자수세기
- 파이썬 딕셔너리
- 딕셔너리
- 웹이란
- 오라클 null값
- WWW
- 오라클 null값 집계함수
- 파이썬기초
- 파이썬
- 아우터조인이란
- 웹
- 아우터조인
- Python dictionary
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |