1. BeautifulSoup
๐ฏ ๊ตฌ๋ฌธ์ ๋ถ์ํด์ ํ์ํ ๋ด์ฉ๋ง ์ถ์ถ ํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ ํจํค์ง
โก๏ธ xml or html์ ์ํ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ ์ถ์ถํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด ์ค๋ค.
from bs4 import BeautifulSoup as bs # bs4 ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ Beautiful Soup๋ฅผ import
import requests
import pprint
# html ํ์ผ ๊ฐ์ ธ์ค๊ธฐ
with open('./sample.html', 'r', encoding='utf-8') as file:
html = file.read()
# html.parser : html ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ BeautifulSoup์ ๊ฐ์ฒด๋ก ๋ถ์
soup = bs(html, 'html.parser')
# ์ฒซ๋ฒ์งธ ์ธ์: ๋ถ์ํ ๋ด์ฉ ์ ๋ฌ
# ๋๋ฒ์งธ ์ธ์: "html"๋ก ๋ถ์ํ๋ค๋ ๊ฒ์ ๋ช
์
print(type(soup)) # <class 'bs4.BeautifulSoup'>
print(soup) # (html ์ถ๋ ฅ)
print(soup.find('title').text) # This is title
print(soup.find('div').text) # Division์ ์ฝ์๋ก, ๋ ์ด์์์ ๋๋๋๋ฐ ์ฌ์ฉ.
print(soup.find('h1').text.strip()) # This is heading1 text.
1) find ()
๐ฅ ์ง์ ๋ ํ๊ทธ๋ค ์ค์์ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ ํ๊ทธ๋ง ๊ฐ์ ธ์ค๋ ๋ฉ์๋(ํ๋์ ๊ฐ๋ง ๋ฐํ)๋ก ๋ฌธ์์ด ํํ๋ก ๋ฐํ
โก๏ธ ์ผ๋ฐ์ ์ผ๋ก ํ๋์ ํ๊ทธ๋ง ์กด์ฌํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ ๋ง์ฝ ์ฌ๋ฌ ํ๊ทธ๊ฐ ์์ผ๋ฉด ์ฒซ ๋ฒ์งธ ํ๊ทธ๋ง ๊ฐ์ ธ์ด
# ์์ฑ๊ฐ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ ํ์ (find, find_all ๋์ผ)
find(ํ๊ทธ๋ช
['์์ฑ๋ช
'])
find(ํ๊ทธ๋ช
.attrs['์์ฑ๋ช
'])
find(ํ๊ทธ๋ช
).get(์์ฑ๋ช
)
find_all('ํ๊ทธ๋ช
', attrs={'์์ฑ๋ช
':'๊ฐ'})
# ์ํคํผ๋์ '๋๊ตฌ๊ด์ญ์' ํ์ด์ง
url = 'https://ko.wikipedia.org/wiki/%EB%8C%80%EA%B5%AC%EA%B4%91%EC%97%AD%EC%8B%9C'
resp = requests.get(url)
soup = bs(resp.text, 'html.parser')
first_img = soup.find(name='img') # img ํ๊ทธ ์ค์ ์ ์ผ ๋จผ์ ๋์ค๋ ๊ฒ
print(type(first_img)) # <class 'bs4.element.Tag'>
print(first_img)
# <img alt="" aria-hidden="true" class="mw-logo-icon" height="50"
# src="/static/images/icons/wikipedia.png" width="50"/>
target_img = soup.find(name='img', attrs={'alt': 'Daedongyeojido (Gyujanggak) 17-02.jpg'})
print(target_img)
# <img alt="Daedongyeojido (Gyujanggak) 17-02.jpg" class="mw-file-element"
# data-file-height="3005" data-file-width="4000" decoding="async" height="376"
# src="//upload.wikimedia.org/wikipedia/commons/thumb/c/c5/
# Daedongyeojido_%28Gyujanggak%29_17-02.jpg/500px-Daedongyeojido_%28Gyujanggak%29_17-02.
# jpg" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Daedongyeojido_
# %28Gyujanggak%29_17-02.jpg/750px-Daedongyeojido_%28Gyujanggak%29_17-02.jpg 1.5x,
# //upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Daedongyeojido_%28Gyujanggak%
# 29_17-02.jpg/1000px-Daedongyeojido_%28Gyujanggak%29_17-02.jpg 2x" width="500"/>
2) find_all()
๐ฅ ์ง์ ํ ํ๊ทธ๋ค์ ๋ชจ๋ ๊ฐ์ ธ์ค๋ ๋ฉ์๋๋ก ๊ฐ์ ธ์จ ํ๊ทธ๋ค์ ๋ชจ๋ ๋ฆฌ์คํธ์ ๋ณด๊ด
# ๋ค์ด๋ฒ ์คํฌ์ธ ํ์ด์ง์์ ๋ฐ์ค ๋ด์ค ์ ๋ชฉ ๋ค๊ณ ์ด
url = 'https://sports.news.naver.com/index.nhn'
response = requests.get(url)
soup = bs(response.text, 'html.parser')
today_list = soup.find('ul', {'class': 'today_list'})
print(today_list)
today_list_title = today_list.find_all('strong', {'class', 'title'})
pprint.pprint(today_list_title) # ๋ฆฌ์คํธ๋ก ๋ฐํ
for title in today_list_title:
print(title.text.strip())
3) find_all ์ฌ์ฉ ์์
a. ๋ค์ ๋ด์ค ์ฌ์ดํธ html ๋ถ์
url = 'https://news.daum.net/'
response = requests.get(url)
soup = bs(response.text, 'html.parser')
b. a ํ๊ทธ์ ๊ฐฏ์ ์ถ๋ ฅ
๐พ html์ 'a' ํ๊ทธ : ๋ค๋ฅธ ์ฝํ ์ธ ์ ์ฐ๊ฒฐ๋๋ ํ์ดํผ๋งํฌ(hyperlink)๋ฅผ ์ ์
print('1. a ํ๊ทธ์ ๊ฐฏ์')
print(len(soup.find_all('a'))) # 124
c. a ํ๊ทธ 20๊ฐ๋ง ์ถ๋ ฅ
print('2. a ํ๊ทธ 20๊ฐ๋ง ์ถ๋ ฅ')
for news in soup.find_all('a')[:20]:
print(news.text.strip())
d. a ํ๊ทธ ๋งํฌ 5๊ฐ ์ถ๋ ฅ
print('3. a ํ๊ทธ ๋งํฌ 5๊ฐ ์ถ๋ ฅ')
for i in soup.find_all('a')[:5]:
print(i.attrs['href'])
print(i.get('href'))
# -> ๋ ์ค ํ๋๋ง ์ฐ๋ฉด ๋๋ค.
print("=" * 20)
e. ํน์ ํด๋์ค ์์ฑ์ ์ถ๋ ฅํ๊ธฐ
print('4. ํน์ ํด๋์ค ์์ฑ์ ์ถ๋ ฅ')
print(soup.find_all('div', {'class': 'item_issue'}))
print("=" * 20)
f. ๋งํฌ๋ฅผ ํ ์คํธ ํ์ผ๋ก ์ ์ฅ
print('5. ๋งํฌ๋ฅผ ํ
์คํธ ํ์ผ๋ก ์ ์ฅ')
file = open('../output_02/links.txt', 'w') # ์ฐ๊ธฐ ์ ์ฉ ํ์ผ ์์ฑ
for i in soup.find_all('div', {'class': 'item_issue'}):
file.write(i.find('a').get('href') + '\n')
file.close()
[ ๋ด์ฉ ์ฐธ๊ณ : IT ํ์ ๊ฐ์ ]