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