Hello creators ๐
3-7_์น์คํฌ๋ํ(ํฌ๋กค๋ง) ๊ธฐ์ด (feat. ๋ค์ด๋ฒ ์ํ ํ์ ์ฌ์ดํธ ํฌ๋กค๋ง, beautifulsoup, select_one, select) ๋ณธ๋ฌธ
[WEB & AI] (feat. ์ทจ์ค)/ํ๋ก ํธ&๋ฐฑ์๋
3-7_์น์คํฌ๋ํ(ํฌ๋กค๋ง) ๊ธฐ์ด (feat. ๋ค์ด๋ฒ ์ํ ํ์ ์ฌ์ดํธ ํฌ๋กค๋ง, beautifulsoup, select_one, select)
๋ถ์๋งค๋_HA 2023. 1. 30. 16:58728x90
๋ฐ์ํ
โ . ์ด๋ฒ ํ์ฐจ ํ์ต ๋ชฉํ (goal)
1. ๋ฐฐ์ฐ๊ณ ์ ํ๋ ๊ฒ
- ์ ๋ชฉ & ํ์ ๋ฑ์ ๊ฐ์ ธ์ค๊ธฐ
โ ก. ํฌ๋กค๋ง์ ํ๋ ค๋ฉด 2๊ฐ์ง๋ฅผ ํด์ผ ํจ
1. ํด๋น ์ฃผ์์ ์์ฒญํด์ ํด๋น html ์ ๊ฐ์ ธ์ค๋ ๊ฒ!
- ์ด ์ฃผ์์ ๊ฐ์ html ์ ๊ฐ์ ธ์์ผ ํจ.
- ์ด๊ฑด requests ๋ฅผ ๊ฐ์ง๊ณ ์ด๋ฏธ ํ์.
๐ ์ฆ, requests
ํจํค์ง๋ฅผ ํตํด html
์ ๊ฐ์ ธ์ค๋ ์์
์ ์ด๋ฏธ ํ์.
โญ ์, `requests` ๋ฅผ ํตํด ํ๋๊ฒ html ์ ๊ฐ์ ธ์ค๋ ๊ฑฐ ๊ตฌ๋! โญโญโญโญโญโญ
2. ๊ฐ์ ธ์จ html ์์์ '์ ๋ชฉ' ์ ์ฐพ์ผ๋ ค๋ฉด? : beautifulsoup ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ
1) beautifulsoup ์ค์น
- pip ์ ๊ทธ๋ ์ด๋
python3 -m pip install --upgrade pip
โ ์ด ์ ๊ทธ๋ ์ด๋๋ฅผ ์ ํด์ผ ํ๋ ๊ฑฐ์ง? ์์ง ์ ๋ชจ๋ฅด๊ฒ ์
- beautifulsoup4 ์ค์น
pip install beautifulsoup4
- ๊ฒฐ๊ณผ๋ฌผ
2) ๋ฝ๊ณ ์ถ์ ๊ฒ ์ฐํด๋ฆญ
> ๊ฒ์ฌ์์ copy selector
- ๋ฝ๊ณ ์ถ์ ๊ฒ > ์ฐํด๋ฆญ > ๊ฒ์ฌ
- copy selector
3) beautifulsoup ๊ธฐ๋ณธ ์์ ์ฝ๋ ๋ฃ์ด๋ณด๊ธฐ
#python_beaufifulsoup_ํฌ๋กค๋ง_์์ ์ฝ๋
import requests
from bs4 import BeautifulSoup
# ์ค์ ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ (๋ง์น, ๋ธ๋ผ์ฐ์ ์์ call ์ ๋ ๋ฆฌ๋ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ , ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ )
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
# ํด๋น url ์์ html ์ ๋ฐ์์จ๋ค. (โ
url ๋ณ๊ฒฝํด์ ์ฌ์ฉ)
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
# html์์ ์ํ๋ ๋ถ๋ถ์ ์์๋ธ๋ค.
soup = BeautifulSoup(data.text, 'html.parser')
# ์ด์ ๋ถํฐ ๋์ค๋ ๋ฌธ๋ฒ์ beaurifulsoup ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด์ ๋ฌธ๋ฒ(syntax)
print(soup)
- ๊ฒฐ๊ณผ๋ฌผ - ๊ทธ๋ฌ๋ฉด, ์ง์ง,
html ๋ฉ์ด๋ฆฌ
๊ฐ ๋ค์ด์จ๋ค.
4) soup.select_one
๊ณผ ํ๋์ copy selector
๋ฅผ ์ด์ฉํด์ html ๋ฉ์ด๋ฆฌ์ ์ค ์ํ๋ ๋ถ๋ถ์ ์ถ๋ฆฌ๊ธฐ
#python_beaufifulsoup_ํฌ๋กค๋ง_์์ ์ฝ๋
import requests
from bs4 import BeautifulSoup
# ์ค์ ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ (๋ง์น, ๋ธ๋ผ์ฐ์ ์์ call ์ ๋ ๋ฆฌ๋ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ , ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ )
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
# ํด๋น url ์์ html ์ ๋ฐ์์จ๋ค. (โ
url ๋ณ๊ฒฝํด์ ์ฌ์ฉ)
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
# html์์ ์ํ๋ ๋ถ๋ถ์ ์์๋ด๊ธฐ ์ํด ์ฐ์ '์ ์ฒด๋ฅผ ๋ด์์จ๋ค.'
soup = BeautifulSoup(data.text, 'html.parser')
# ์ด์ ๋ถํฐ ๋์ค๋ ๋ฌธ๋ฒ์ beaurifulsoup ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด์ ๋ฌธ๋ฒ(syntax)
# ๋ด์ ์จ ๊ฒ ์ค copy selector ๋ฅผ ์ด์ฉํด์ ์์๋ธ๋ค.
# ๊ฒฐ๊ณผ๋ฌผ์ a ํ๊ทธ ์ ํ
์คํธ๋ก ๋์จ๋ค.
title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
print(title)
print(title.text)
print(title['href'])
print(title)
๊ฒฐ๊ณผ๋ฌผ
>>> print(title)
<a href="/movie/bi/mi/basic.naver?code=186114" title="๋ฐฅ์ ">๋ฐฅ์ </a>
- ๋๋์
- ์ฌ๊ธฐ์ ๋ง๋ํ๊ฒ ๋์ค๋๊ฑด ์๋๊ตฌ๋,
- ์ฆ, ๋ด๊ฐ ์ํ๋ ๊ฑด, '๋ฐฅ์ ' ๊ธ์จ ์ธ๋ฐ, ==ํ ๋ฒ์ ๋์ค๋๊ฒ ์๋๋ผ, a ํ๊ทธ๋ ์์ฌ์ ๋์ค๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ ์์ ๋ด์ค์ผ ํ๋ค. ==
print(title.text)
๊ฒฐ๊ณผ๋ฌผ
>>> print(title.text)
๋ฐฅ์
print(title['href'])
๊ฒฐ๊ณผ๋ฌผ
>>> print(title['href'])
/movie/bi/mi/basic.naver?code=186114
5) soup.select
์ ์ฌ๋ฌ๊ฐ์ copy selector
๋ฅผ ์ด์ฉํด์ html ๋ฉ์ด๋ฆฌ์ ์ค ์ํ๋ ๋ถ๋ถ์ ์ถ๋ฆฌ๊ธฐ
a) ์ด๋๊น์ง ๋๊ฐ์์ง ํ์ธ
- ๋ค์ด๋ฒ ์ํ์ ๊ฒฝ์ฐ,
old_content > table > tbody > tr
๊น์ง๋ ๋์ผ
b) ๊ทธ๊ฑธ select ์ ๋ฃ๊ณ ์คํํ๋ฉด?
import requests
from bs4 import BeautifulSoup
# ์ค์ ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ (๋ง์น, ๋ธ๋ผ์ฐ์ ์์ call ์ ๋ ๋ฆฌ๋ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ , ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ )
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
# ํด๋น url ์์ html ์ ๋ฐ์์จ๋ค. (โ
url ๋ณ๊ฒฝํด์ ์ฌ์ฉ)
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
# html์์ ์ํ๋ ๋ถ๋ถ์ ์์๋ด๊ธฐ ์ํด ์ฐ์ '์ ์ฒด๋ฅผ ๋ด์์จ๋ค.'
soup = BeautifulSoup(data.text, 'html.parser')
# ์ด์ ๋ถํฐ ๋์ค๋ ๋ฌธ๋ฒ์ beaurifulsoup ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด์ ๋ฌธ๋ฒ(syntax)
# ๋ด์ ์จ ๊ฒ ์ค copy selector ๋ฅผ ์ด์ฉํด์ ์์๋ธ๋ค.
# ๊ฒฐ๊ณผ๋ฌผ์ a ํ๊ทธ ์ ํ
์คํธ๋ก ๋์จ๋ค.
title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
- ์คํํ๋ฉด, ์ด๋ ๊ฒ ๋ฌด์๋ฌด์ ํ๊ฒ ์ฐํ โญโญโญโญโญโญ
๐ ์ด๊ฒ ์๋ฏธํ๋ ๊ฑด? ์ข ๋ ํ์ธํด๋ณด์.
c) copy selector ์ ๊ฒ์ฌ๋ฅผ ๋๋ฌ์ ๋ณผ ์ ์๋ ๊ฑธ ๋น๊ตํ๋ฉด, ํํธ๋ฅผ ์ป์ ์ ์์.
copy selector
ํ ๋ถ๋ถ#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
- select ํจ์์ ๋ฃ์ ๋ถ๋ถ
movies = soup.select('#old_content > table > tbody > tr')
- ๊ฒ์ฌ ๋๋ฌ์ ๋์จ ๊ฒฐ๊ณผ tr ๊น์ง๋ง ํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด๊ฐ ๋์ค๊ฒ ๋์์. ์ด๋, ์ ์ฒด๊ฐ '๋ฆฌ์คํธ' ์ ๋ด๊ฒจ ๋์ค๊ฒ ๋จ. ๊ทธ๋์ ๋ฌด์๋ฌด์ ํ๊ฑฐ ์์.
- ๊ทธ๋ฌ๋ฉด, ์ด๊ฑธ ์ด์งธ?
- ๋ฆฌ์คํธ๋ก ๋ด๊ฒจ ์์ผ๋๊น for ๋ฐ๋ณต๋ฌธ์ผ๋ก ํน์ ๊ฐ์ ์ ๊ทผํ๊ณ -> ๊ทธ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด์ ์ํ๋ ์ ๋ชฉ ๊น์ง ๊ฐ ์ ์์ ๊ฒ
d) ๊ฒฐ๊ณผ์ ์ผ๋ก, 1) ๊ณตํต ๋ถ๋ถ ๊น์ง๋ฅผ ์ถ์ถ ํ๊ธฐ ๋๋ฌธ์, ์ ์ฒด๊ฐ ๋์ค๊ฒ ๋๊ณ 2) ํด๋น ๋ถ๋ถ์ ๋ฆฌ์คํธ์ ๋ด๊ฒจ ์๊ธฐ ๋๋ฌธ์ 3) ๋ฆฌ์คํธ + ๋ฐ๋ณต๋ฌธ์ ํตํด ์ํ๋ ๊ฐ์ผ๋ก ์ ๊ทผํ ์ ์์.
- ๋ฆฌ์คํธ + ๋ฐ๋ณต๋ฌธ์ด ์๋ํ๋ ์ฝ๋
import requests
from bs4 import BeautifulSoup
# ์ค์ ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ (๋ง์น, ๋ธ๋ผ์ฐ์ ์์ call ์ ๋ ๋ฆฌ๋ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ , ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ )
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
# ํด๋น url ์์ html ์ ๋ฐ์์จ๋ค. (โ
url ๋ณ๊ฒฝํด์ ์ฌ์ฉ)
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
# html์์ ์ํ๋ ๋ถ๋ถ์ ์์๋ด๊ธฐ ์ํด ์ฐ์ '์ ์ฒด๋ฅผ ๋ด์์จ๋ค.'
soup = BeautifulSoup(data.text, 'html.parser')
# ๋ณต์๊ฐ์ copy selector ๋ฅผ ํ์ฉํ๊ณ ์ถ์.
# '๋ฐฅ์ ' ๊ณผ '๊ทธ๋ฆฐ ๋ถ' copy selector ๋ฅผ ์ฐ์ด๋ด
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
# ๊ณตํต๋๋ ๋ถ๋ถ์ select ํจ์์ ๋ฃ๊ธฐ
movies = soup.select('#old_content > table > tbody > tr')
for movie in movies:
a = movie.select_one('td.title > div > a')
print(a)
- ๊ณผ์ ์ค๋ช
- ๊ฒฐ๊ณผ๋ฌผ
e) ๋ฐ์ค(none) ์์ ๊ณ ์ ๋ชฉ ๋ฝ๊ธฐ
- ๋ฐ์ค ์ ํ์
- ์๋ํ๋ ์ฝ๋
import requests
from bs4 import BeautifulSoup
# ์ค์ ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ (๋ง์น, ๋ธ๋ผ์ฐ์ ์์ call ์ ๋ ๋ฆฌ๋ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ , ์ฌ๋์ธ ๊ฒ ์ฒ๋ผ ํด์ฃผ๋ ค๊ณ )
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
# ํด๋น url ์์ html ์ ๋ฐ์์จ๋ค. (โ
url ๋ณ๊ฒฝํด์ ์ฌ์ฉ)
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
# html์์ ์ํ๋ ๋ถ๋ถ์ ์์๋ด๊ธฐ ์ํด ์ฐ์ '์ ์ฒด๋ฅผ ๋ด์์จ๋ค.'
soup = BeautifulSoup(data.text, 'html.parser')
# ๋ณต์๊ฐ์ copy selector ๋ฅผ ํ์ฉํ๊ณ ์ถ์.
# '๋ฐฅ์ ' ๊ณผ '๊ทธ๋ฆฐ ๋ถ' copy selector ๋ฅผ ์ฐ์ด๋ด
#old_content > table > tbody > tr:nth-child(2) > td.title > div > a
#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
# ๊ณตํต๋๋ ๋ถ๋ถ์ select ํจ์์ ๋ฃ๊ธฐ
movies = soup.select('#old_content > table > tbody > tr')
for movie in movies:
a = movie.select_one('td.title > div > a')
if a != None: # if a is not None ({๋์ผ})
print(a.text)
- ๊ฒฐ๊ณผ๋ฌผ
๐ญ What i learned
- ํฌ๋กค๋ง์์ ํ์ํ ๊ณผ์ 1) ํด๋น url ์์ html ๊ฐ์ ธ์ค๊ธฐ 2) ๊ฐ์ ธ์จ html ์์ ํ์ํ ๋ถ๋ถ ๋ฝ์๋ด๊ธฐ ๊ตฌ๋!!! โญโญโญ ์ด๋ ๊ฒ ๋จ๊ณํ ํ ์ ์๊ฒ ๋ค.
- select ๋ฅผ ์ด๋ค๊ณ ํด์ ==ํ ๋ฒ์ ๋์ค๋๊ฒ ์๋๋ผ, a ํ๊ทธ๋ ์์ฌ์ ๋์ค๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ ์์ ๋ด์ค์ผ ํ๋ค. ==
728x90
๋ฐ์ํ
'[WEB & AI] (feat. ์ทจ์ค) > ํ๋ก ํธ&๋ฐฑ์๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Comments