파이썬으로 HTML 문서 분석:
설치해야할 패키지(pip install package-name)
1) beautifulsoup4: HTML 요소들을 분석하는 패키지
2) html5lib: HTML 문서를 parsing(분석)
3) requests: HTTP 요청(request)을 보내고, 서버로부터 응답(response)을 받는 기능을 담당.
web01.html-----------------------------------------------------------------------------------------------------------------
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Web 1</title>
</head>
<body>
<!--
주석(comment): HTML 문서에 대한 설명
tag: html, body, h1, p, div, img, ...
start tag와 end tag가 짝을 이룸.
attribute: start 태그 안에서 속성들을 설정하기 위해서 사용.
charset, href, src, style, ...
content: start 태그와 end 태그 사이의 내용들.
문서의 계층구조(hierarchy): DOM(Document Object Model)
브라우저(Chrome, IE, Firefox, ...)는 HTML 문서를 분석해서 화면에 보여줌.
-->
<!-- h1 ~ h6: heading(제목). 숫자가 작을 수록 더 큰 폰트 사용. -->
<h1>처음 작성하는 HTML</h1>
<h2>HTML: HyperText Markup Language</h2>
<p>여기는 <b>paragraph</b>입니다.</p>
<!-- b: bold. 두꺼운 폰트 -->
<div>여기는 <strong>division</strong>입니다.</div>
<!-- strong: "강조"하기 위해서 두꺼운 폰트를 사용.
HTML5 규격에서 추가된 semantic tag. -->
<!-- a: anchor. 링크 -->
<a href="https://www.daum.net/">다음 카카오</a>
<a href="https://www.daum.net/">
<img src="daum.png" style="width: 200px;" />
</a>
</body>
</html>
-----------------------------------------------------------------------------------------------------------------------------
web02.html-------------------------------------------------------------------------------------------------------------------
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Web 2</title>
<style>
/* CSS(Cascade Style Sheet):
웹(HTML) 문서의 스타일(화면 배치, 색상, 폰트, ...)을 결정
CSS Selector(선택자): 스타일을 적용하기 위해서 HTML 요소를 찾는 방법
1) HTML 태그 이름
2) .class
3) #id
4) pseudo selector
*/
li {
list-style-type: none; /* bullet 이미지 제거 */
display: inline-block; /* 요소들을 한 줄에 표시 */
}
a {
text-decoration: none; /* 링크의 밑줄을 제거 */
}
a:visited { /* 방문했었던 링크 */
color: black;
}
.class1 {
color: blue; /* 글자색 */
border: 2px solid gray; /* 테두리선 */
margin: 16px; /* 바깥 여백 */
padding: 8px; /* 안쪽 여백 */
}
#id1 {
color: red;
font-weight: bold;
}
</style>
</head>
<body>
<h1>두번째로 만드는 HTML</h1>
<!-- List -->
<ul> <!-- ul: unordered list -->
<li>
<a href="https://www.google.com/">구글</a>
</li> <!-- li: list item -->
<li>
<a href="https://www.naver.com/">네이버</a>
</li>
<li>
<a href="https://www.daum.net/">다음 카카오</a>
</li>
</ul>
<div class="class1">여기는 class1입니다.</div>
<div class="class1">여기는 class1입니다.</div>
<div class="class2">여기는 class2입니다.</div>
<div class="class2" id="id1">여기는 class2입니다.</div>
</body>
</html>
-------------------------------------------------------------------------------------------------------------------------------
with open('web01.html', mode='r', encoding='UTF-8') as f:
# HTML 문서와 HTML parser(분석기)를 파라미터에 전달해서,
# BeautifulSoup 객체 생성
soup = BeautifulSoup(f, 'html5lib')
# print(soup) # HTML의 내용
# HTML 요소들 중에서 h1 요소를 찾음
h1 = soup.find('h1') # find('태그이름')
print(h1)
print(h1.string) # h1 요소 안의 문자열
h2 = soup.h2 # soup.태그이름 - soup.find('h2')와 동일
print(h2)
print(h2.string)
<h1>처음 작성하는 HTML</h1>
처음 작성하는 HTML
<h2>HTML: HyperText Markup Language</h2>
HTML: HyperText Markup Language
# paragraph 요소 안의 문자열을 찾아서 출력
# text 속성은 자식 요소(child element) 태그들을 제거하고, 텍스트만 찾아줌.
# print(soup.find('p').text)
print(soup.p.text)
여기는 paragraph입니다.
# find는 HTML 문서를 처음부터 분석을 하다가 가장 처음에 만나는 요소를 리턴함.
print(soup.find('a'))
# find_all은 HTML 문서 전체에서 찾은 모든 요소들의 리스트를 리턴함.
print(soup.find_all('a'))
<img src="daum.png" style="width: 200px;"/>
</a>]
from bs4 import BeautifulSoup
with open('web02.html', mode='r', encoding='UTF-8') as f:
soup = BeautifulSoup(f, 'html5lib')
# print(soup)
# HTML 문서 안의 모든 div 태그를 찾음
for div in soup.find_all('div'): # soup('div')와 soup.find_all('div')는 동일한 기능
print(div.text)
여기는 class1입니다.
여기는 class1입니다.
여기는 class2입니다.
여기는 class2입니다.
# HTML 문서 안의 'class1' 클래스 속성을 갖는 모든 요소들을 찾음
# soup(attrs = {attr이름: attr값})
# soup.find_all(attrs={attr이름:attr값})
for class1 in soup.find('div', class_= 'class1'):
print(class1)
for class1 in soup(attrs={'class': 'class1'}):
print(class1)
<div class="class1">여기는 class1입니다.</div>
<div class="class1">여기는 class1입니다.</div>
# HTML 문서 안의 'class2' 클레스 속성을 갖는 모든 요소들을 찾음
for cls2 in soup.find_all(class_= 'class2'):
print(cls2)
<div class="class2">여기는 class2입니다.</div>
<div class="class2" id="id1">여기는 class2입니다.</div>
# HTML 문서 안의 'id1'아이디 속성을 갖는 모든 요소들을 찾음
for id1 in soup.find(id= 'id1'):
print(id1)
<div class="class2" id="id1">여기는 class2입니다.</div>
import requests
from bs4 import BeautifulSoup
# 접속할 url
url = 'https://search.daum.net/search?w=news&q=%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D&DA=YZR&spacing=0'
url1= 'https://zh.dict.naver.com/#/entry/zhko/0cb25d23fd4c4afe9b4cd5a22ccad8ca'
url3 = 'https://search.naver.com/search.naver?sm=top_hty&fbm=0&ie=utf8&query=%EB%A8%B8%EC%8B%A0+%EB%9F%AC%EB%8B%9D'
# 사이트(웹 서버)로 요청(request)를 보냄
html = requests.get(url).text.lstrip() # 요청의 결과(응답, response - HTML)을 저장
soup = BeautifulSoup(html, 'html5lib')
# print(soup.find('a'))
# HTML 문서의 모든 링크에 걸려있는 주소들을 출력
# 관심있는 링크(뉴스 링크)들만 찾을 수 있는 방법을 고민
for articles in soup.find('ul', id='clusterResultUL').find_all('a', class_='f_link_b'):
print(articles['href'])