티스토리 뷰

[빅데이터] 파이썬으로 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)")
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함