본문 바로가기
Python

Python - HTML·CSS 이해와 크롤링

by DGK 2021. 10. 28.

 

인프런 파이썬 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

HTML·CSS 이해를 통한 크롤링 연습(Python)

크롤링을 하기 위한 최소한의 HTML·CSS 문법을 다루고자 한다.

 

크롤링 연습

from bs4 import BeautifulSoup

html = """
 <html> 
    <body> 
     <h1 id='title'>[1] 크롤링이란?</h1>
     <p class='cssstyle'>웹 페이지에서 필요한 데이터를 추출하는 것</p>
     <p id='body' align='center'>파이썬을 중심으로 다양한 웹크롤링 기술 발달</p>
    </body> 
 </html>
       """
soup = BeautifulSoup(html, "html.parser") 
data = soup.find('h1')


print(data)
print(data.string)
print(data.get_text())

# 결과 :
# <h1 id="title">[1] 크롤링이란?</h1>
# [1] 크롤링이란?
# [1] 크롤링이란?


data = soup.find('p')
print(data)
print(data.string)
print(data.get_text())

# 결과 :
# <p class="cssstyle">웹 페이지에서 필요한 데이터를 추출하는 것</p>
# 웹 페이지에서 필요한 데이터를 추출하는 것
# 웹 페이지에서 필요한 데이터를 추출하는 것


data = soup.find(id = 'body')
print(data)
print(data.string)
print(data.get_text())

# 결과 :
# <p align="center" id="body">파이썬을 중심으로 다양한 웹크롤링 기술 발달</p>
# 파이썬을 중심으로 다양한 웹크롤링 기술 발달
# 파이썬을 중심으로 다양한 웹크롤링 기술 발달

 

find() 함수로 추출한 데이터를 읽어오는 경우, string 또는 get_text() 함수를 사용하는데 경우에 따라 둘 중 하나는

오류를 발생시킬 수도 있다. [따라서, 두 가지 방식을 적절히 혼용해서 데이터를 읽어오면 됨(대부분 get_text() 사용)]

즉, string과 get_text() 함수 모두 추출한 데이터를 읽어오는 기능을 한다. (ex. data.string/ data.get_text())

 

 

속성, class, id를 활용한 데이터 추출 연습

from bs4 import BeautifulSoup

html = """
 <html> 
    <body> 
     <h1 id='title'>[1] 크롤링이란?</h1>
     <p class='cssstyle'>웹 페이지에서 필요한 데이터를 추출하는 것</p>
     <p id='body' align='center'>파이썬을 중심으로 다양한 웹크롤링 기술 발달</p>
    </body> 
 </html>
       """

data1 = soup.find('p', class_ = 'cssstyle')	     # class 활용
data2 = soup.find('p', 'cssstyle')		     # class 활용
data3 = soup.find('p', attrs = {'align': 'center'})  # 속성, 속성값 활용
data4 = soup.find(id = 'body')			     # id 활용


print(data1.string)

# 결과 : 웹 페이지에서 필요한 데이터를 추출하는 것


print(data2.string)

# 결과 : 웹 페이지에서 필요한 데이터를 추출하는 것


print(data3.string)

# 결과 : 파이썬을 중심으로 다양한 웹크롤링 기술 발달


print(data4.string)

# 결과 : 파이썬을 중심으로 다양한 웹크롤링 기술 발달

 

위의 4가지 방법으로 HTML 태그의 속성, class, id를 활용하여 데이터를 가져올 수 있다.

find() 함수는 인자와 매치되는 태그의 데이터를 가져오는데, 오직 첫 번째 태그의 데이터만을 가져온다.

(해당 태그와 관련된 모든 데이터를 가져오려면, find_all() 함수를 사용해야함)

 

import requests
from bs4 import BeautifulSoup

res = requests.get('https://news.v.daum.net/v/20170615203441266')
soup = BeautifulSoup(res.content, 'html.parser')

mydata1 = soup.find('h3', 'tit_view')
print(mydata1.string)

# 결과 : 잔금대출에도 DTI 규제 적용 검토


mydata2 = soup.find('span', 'txt_info')
print(mydata2.get_text())

# 결과 : 김동욱

 

mydata3 = soup.find('div', 'layer_util layer_summary')
print(mydata3.get_text())

 

```
결과 :


금융당국이 급증하는 가계부채 증가세를 막기 위해 아파트 잔금대출에도 소득을 따져 대출한도를 정하는

총부채상환비율(DTI)을 적용하는 방안을 유력하게 검토하고 있다. 지금은 집값을 기준으로 대출한도를 매기는

주택담보인정비율(LTV) 규제만 적용돼 소득이 없어도 집값의 70%를 빌려 잔금을 치르는 게 가능하다.

앞으로 잔금대출에 DTI가 적용되면 소득이 없는 사람은 집값의 70% 대출 받는 게 어려워진다.

기사 제목과 주요 문장을 기반으로 자동요약한 결과입니다. 전체 맥락을 이해하기 위해서는 본문 보기를 권장합니다.

```

 

위의 예시코드에서 tit_view, txt_info, layer_util layer_summary는 모두 class 값이다.

(class를 활용한 데이터 추출)

 

 

find_all() 함수 활용 예시(데이터 추출)

from bs4 import BeautifulSoup

html = """
 <html> 
    <body> 
     <h1 id='title'>[1] 크롤링이란?</h1>
     <p class='cssstyle'>웹 페이지에서 필요한 데이터를 추출하는 것</p>
     <p id='body' align='center'>파이썬을 중심으로 다양한 웹크롤링 기술 발달</p>
    </body> 
 </html>
       """
       
soup = BeautifulSoup(html, 'html.parser')
data = soup.find_all('p')
for i in data:
    print(i.string)
    
# 결과 : 
# 웹 페이지에서 필요한 데이터를 추출하는 것
# 파이썬을 중심으로 다양한 웹크롤링 기술 발달

 

find_all() 함수는 인자로 들어온 값과 매치되는 HTML 태그를 모두 가져오는 함수이다.

또한, find_all() 함수는 추출한 데이터를 리스트 형태로 가져오기 때문에 곧바로 string 또는 get_text() 함수를

사용하여 데이터를 출력하고자 하면 에러가 발생한다.

따라서, for문을 통해 해당 리스트의 요소를 하나씩 가져온 후에, string or get_text() 함수를 사용하여 데이터를

출력해야한다.

 

import requests
from bs4 import BeautifulSoup

res = requests.get('https://news.v.daum.net/v/20170615203441266')
soup = BeautifulSoup(res.content, 'html.parser')

mydata = soup.find_all('span', 'txt_info')
for i in mydata:
    print(i.get_text())
    
# 결과 : 
# 김동욱
# 입력 2017. 06. 15. 20:34
# 수정 2017. 06. 15. 21:31   
    
    
print(mydata[1].get_text())

# 결과 : 입력 2017. 06. 15. 20:34

 

find_all() 함수를 사용하여 리스트 형태로 데이터를 추출할 경우, 리스트 자료형을 읽어오는 코드를 사용하여 데이터를

가져올 수도 있다. (항상 for문을 써야하는 것은 아님)

 

 

 

 

 

'Python' 카테고리의 다른 글

Python - CSS selector를 활용한 크롤링  (0) 2021.10.29
Python - 크롤링 기술 팁  (0) 2021.10.29
Python - crawling pattern  (0) 2021.10.28
Python - 기본 문법(추가내용)  (0) 2021.10.21
Python - File Write  (0) 2021.10.20

댓글