keyword : ํฌ๋กค๋ง, ์น ์คํฌ๋ ์ดํ, HTML/CSS/JS, DOM, Request, BeautifulSoup
HTML/CSS/JS
HTML : ์น์ ๊ตฌ์กฐ๋ฅผ ์ค์ ํด์ฃผ๋ ์ธ์ด(๊ฐ๋ค๋๊ธฐ)
Element : ์์ ๋ผ๋ ์๋ฏธ๋ก head, body, div ๋ฑ๊ณผ ๊ฐ์ ํ๊ทธ๋ก ํํ๋๋ฉฐ ๊ตฌ์ฑ ๋ด์์์ ์ญํ ์ ๋ํ๋ด์ค๋ค.(์น ์คํฌ๋ ์ดํ ์, ํ๊ทธ๋ฅผ ํตํด ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฏ๋ก ์์๋๊ธฐ)
Parent/Children
<ul>
<li>Hello</li>
<li>World</li>
<li>!</li>
</ul>
ul ์ li ์ ์์ ํ๊ทธ, li๋ ul์ ํ์ ํ๊ทธ
CSS : HTML์ ์ฌ๋ฌ๊ฐ์ง ์คํ์ผ์ ๋ฃ์ด์ฃผ๋ ์ธ์ด(๊พธ๋ฏธ๊ณ )
Selector : ํน์ ์์๋ฅผ ์ ํํ ์ ์๋ ๋ฐฉ๋ฒ, ๋ ์ฝ๊ฒ ์ํ๋ ์์๋ค์ ์ ํํด ์ ๊ทผ ๊ฐ๋ฅ
- Type selector: CSS ํ์ ์ ๋ฐ๋ผ์ ์ ํํ ์ ์์ต๋๋ค (์๋ฅผ ๋ค์ด 'p', 'div' ๋ฑ)
- Class selector: ํด๋์ค์ ๋ฐ๋ผ ์ ํํ ์ ์์ต๋๋ค.
- Id selector: id ์ ๋ฐ๋ผ ์ ํํ ์ ์์ต๋๋ค.
์์ : CSS๋ ์์์ ์์น์ ๋ฐ๋ผ ์์ ์์์ ์คํ์ผ์ ์์, ๋จ ์์๋ฐ๋ ์กฐ๊ฑด๋ณด๋ค ๋ณธ์ธ์ด ๊ฐ๊ณ ์๋ ์กฐ๊ฑด์ด ๋ ์ฐ์
<div style="color:red">
<p>I have no style</p>
</div>
- ํด๋์ค(์น ์คํฌ๋ ์ดํ ์ ์ค์) : ์ด๋ค ํน์ ์์๋ค์ ์คํ์ผ์ ์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉ, ๋์์ ์ฌ๋ฌ ๊ฐ์ ์์๋ค์ ๋ํ ์คํ์ผ์ ์ ํ ๋ ํด๋์ค๋ฅผ ์ง์ ํ์ฌ ์์์ ๋ฐ๋๋ก ํจ.(ํด๋์ค๋ . ์ผ๋ก ํํํฉ๋๋ค. ex) .banana)
<p class="banana">I have a banana class</p>
<p class="banana fruit orange">I have many classes</p> # ์ฌ๋ฌ๊ฐ์ ํด๋์ค๋ ๋ถ์ฌ ๊ฐ๋ฅ
- ID : ํด๋์ค์ ๋น์ทํ์ง๋ง ํด๋์ค๊ฐ ์ง๋จ์ ์ ํํ๋ค๋ฉด, ID๋ ๊ฐ๋ณ ํ๋ํ๋๋ฅผ ์ง์ (ID๋ #์ผ๋ก ํํํฉ๋๋ค. ex) #pink)
<p id="pink">My id is pink</p>
JS : ๋์์ ๋ด๋น(์ํจ๋ค)
์น ์คํฌ๋ ์ดํ์ ์ํด ๊ธฐ๋ณธ์ ์ธ ์น ๊ตฌ์กฐ๋ฅผ ์๋ ๊ฒ์ด ํ์!! ์น์์ F12๋ฅผ ๋๋ฌ ์น์ ์๋ ์ ๋ณด๊ฐ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด์๋์ง, ์์น๋ฅผ ์ ์ ์๋๋ก ํด์ผํ๋ค.
DOM(Document Object Model ; ๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ)
DOM์ HTML, XML ๋ฑ ๋ฌธ์์ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค๋ก ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ํตํด์ HTML ๋ฌธ์ ๋ฑ์ ์ ๊ทผํ ์ ์๋๋ก ๋์์ค๋๋ค.
DOM์ ๋ฌธ์๋ฅผ ํ๋์ ๊ตฌ์กฐํ๋ ํ์์ผ๋ก ํํ์ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด์ ์ํ๋ ๋์(ํน์ ํด๋์ค, ํ๊ทธ์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค๋ ์ง)์ ํ ์ ์์ต๋๋ค.
DOM์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ค ํ๋์ธ 'object'๋ก ํํ์ ํ๋๋ฐ, ์ด๋ ํ์ด์ฌ์์์ dictionary์ ๋น์ทํ ํํ์ ๋๋ค.
DOM์ ํตํด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฌ์ฉํ ์ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ํํ๋ก ์์ ์ ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ ์น ํ์ด์ง๋ฅผ ํตํ ์์ (์คํฌ๋ ์ดํ, ํฌ๋กค๋ง ๋ฑ)์์ ๋งค์ฐ ์ค์ํ ๊ฐ๋ ์ ๋๋ค.
DOM ๋ฉ์๋
- ์น ๋ธ๋ผ์ฐ์ ์์ ๊ฐ๋ฐ์ ๋๊ตฌ(F12)๋ฅผ ์ด์ด ์ฝ์ ์ฐฝ์ผ๋ก ๋ค์ด๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์ฌ์ฉํด๋ณด๊ธฐ
document.querySelectorAll('p')
=> 'p' ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ ์์๋ค์ ๋ด์ ์ ์ฌ ๋ฐฐ์ด(NodeList)์ ๋ฐ๊ฒ ๋ฉ๋๋ค.
- getElementsbyTagName: ํ๊ทธ ์ด๋ฆ์ผ๋ก ๋ฌธ์์ ์์๋ค์ ๋ฆฌํดํฉ๋๋ค.
- getElementById: 'id' ๊ฐ ์ผ์นํ๋ ์์๋ค์ ๋ฆฌํดํฉ๋๋ค.
- getElementsByClassName: 'ํด๋์ค' ๊ฐ ์ผ์นํ๋ ์์๋ค์ ๋ฆฌํดํฉ๋๋ค. class๋ฅผ ํตํ ํธ์ถ์ด ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
- querySelector: ์ ๋ ํฐ(๋ค)๊ณผ ์ผ์นํ๋ ์์๋ฅผ ๋ฆฌํดํฉ๋๋ค.
- querySelectorAll: ์ ๋ ํฐ(๋ค)๊ณผ ์ผ์นํ๋ ๋ชจ๋ ์์๋ค์ ๋ฆฌํดํฉ๋๋ค.
DOM๊ณผ ํฌ๋กค๋ง
ํ์ด์ฌ์์ ํฌ๋กค๋ง์ ํ์ฌ ์นํ์ด์ง์ ์ ๋ณด๋ฅผ ๋ชจ๋ str ํํ๋ก ๊ฐ์ ธ์จ๋คํด๋ ์ด๋ฅผ ๊ตฌ๋ถํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์๋ ํ๊ณ๊ฐ ์์ต๋๋ค. ์ด๋, ์นํ์ด์ง๋ฅผ ํ ์คํธ ํ์์ด ์๋ DOM ํ์์ผ๋ก ํ์ฉํฉ๋๋ค.
์์)
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>h1 ํ๊ทธ์
๋๋ค.</h1>
<p>p ํ๊ทธ์
๋๋ค.</p>
</body>
</html>
'h1' ํ๊ทธ์ ํด๋นํ๋ ๋ด์ฉ์ ์๊ณ ์ถ๋ค๋ฉด DOM์ ํ์ฉํฉ๋๋ค! ๋ง์ฝ ์์ ๊ฐ๋ค์ ๊ทธ๋ฅ ๋ฌธ์์ด๋ก ๋ฐ๊ณ ๊ทธ ๋ค์ ํ์ด์ฌ์์ ์ฌ๊ตฌ์กฐํํ๋ ค๋ฉด ๋๋ฌด ๋นํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์น ์คํฌ๋ ์ดํ/ํฌ๋กค๋ง
์คํฌ๋ ์ดํ : ๊ธ์ด๋ชจ์ผ๊ธฐ -> ์น์์ ํน์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ๋ชฉ์
- ์น์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ๊ฒ๋ฟ ์๋๋ผ ๊ตฌ์กฐ๋ฅผ ๋ถ์ํ๋ ๋์๋ ์ฌ์ฉํฉ๋๋ค.
ํฌ๋กฑ๋ง : ์น(Web)์ด๋ ๊ฑฐ๋ฏธ์ค์ ๊ธฐ์ด๋ค๋๊ธฐ -> ์ธํฐ๋ท์ ์ฌ์ดํธ๋ค์ ์ธ๋ฑ์ฑํ๋ ๋ชฉ์
- ํ๋ก๊ทธ๋จ์ด ์น ์ฌ์ดํธ๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ๋๋ฉฐ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ ๊ธฐ์ , ์ด ๋ ์ด ํ๋ก๊ทธ๋จ์ 'ํฌ๋กค๋ฌ', '์คํ์ด๋'๋ผ๊ณ ํฉ๋๋ค.
requests ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์น๊ณผ ํธํ๊ฒ ์ํตํ๊ฒ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํ์ด์ฌ์์ HTTP ์์ฒญ์ ๋ณด๋ผ ๋ ์ฌ์ฉํฉ๋๋ค.
$ pip install requests
import requests
requests.get('https://google.com') # <Response [200]> ๊ณผ ๊ฐ์ HTTP ์๋ต ๊ฐ์ฒด๊ฐ ๋ฆฌํด๋ฉ๋๋ค. (์๋ฒ์ ์ฐ๊ฒฐํ ์ ์๋ค๋ฉด 404)
๋ณดํต ์๋์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
import requests
url = 'https://google.com'
resp = requests.get(url)
resp.status_code # ์๋ต์ ์ํ ์ฝ๋๋ฅผ ํ์ธ (์ซ์๊ฐ ๋์ด)
์๋ต์ ์ฑ๊ณต์ฌ๋ถ๋ฅผ ์ํ ๋ฉ์์ง์ ๋ฒํธ๋ฅผ ๋ถ์ฌํ์ฌ ํํํฉ๋๋ค.
- 200์ ์ฑ๊ณต์ ์๋ฏธํ๊ณ , ์น ํ์ด์ง๋ฅผ ์ฐพ์ ์ ์์ ๋๋ 404๋ก ํํ๋ฉ๋๋ค.
200์ด ์ฑ๊ณต์ด, 404์ ์คํจ๊ณ ๋ฑ ๋ณด๋ค ๋ ์ค์ํ ๊ฒ์ ๊ฒฐ๊ตญ, ์น ํ์ด์ง๋ฅผ ๋ฌด์ฌํ ๋ฐ์๋๋ ์ ๋๋ค.
import requests
from requests.exceptions import HTTPError
url = 'https://google.com'
try:
resp = requests.get(url)
resp.raise_for_status()
except HTTPError as Err:
print('HTTP ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค.')
except Exception as Err:
print('๋ค๋ฅธ ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค.')
else:
print('์ฑ๊ณต')
์์ ๊ฐ์ ์ฝ๋๋ฅผ ํตํด HTTP ์์ฒญ ์ ์ฑ๊ณต ์ ๋ฌด๋ฅผ ํ๋จ ๊ฐ๋ฅํฉ๋๋ค.
HTTP๋ฅผ ์์ฒญํ๋ ๊ฒ์ด ์คํฌ๋ ์ดํ, ํฌ๋กค๋ง์ ๊ธฐ๋ณธ์
๋๋ค.
์น ๋ธ๋ผ์ฐ์ ๋ ๊ฒฐ๊ตญ ๊ธธ๊ฒ ์ฃผ์ด์ง HTML์ ์ฐ๋ฆฌ๊ฐ ๋ณด๊ธฐ ํธํ๊ฒ ํด์ฃผ๋ ์ญํ ์
๋๋ค.
์ด ๋, requests ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์น ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฐ๋ ๋์ผํ HTML ๋ฌธ์๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
resp = requests.get(url)
resp.text
BeautifulSoup ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ด์ ๋ ๋๋ ค๋ฐ์ ์๋ต ๋ด์ฉ์ ํ์ฑํ๊ณ ์ ๋ณด๋ฅผ ์ป์ด๋ผ ์ ์์ด์ผํฉ๋๋ค.(๋จ์ ๋ฌธ์์ด์ด ์๋ DOM ํํ๋ก ๋ ๋๋ง(๋ฐ๊ฟ์ฃผ๋ ์์ ))
pip install beautifulsoup4
import requests
from bs4 import BeautifulSoup
url = 'https://google.com'
page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')
์ฆ, requests ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋จผ์ ํ์ฑํ ํ์ด์ง๋ฅผ ๋ฐ์์จ ํ ๋ฌธ์์ด๋ก ๋ณํํ๊ณ ํ์๋ฅผ ์ด์ฉํ์ฌ DOM ํํ์ soup์ ๋ง๋ค์ด์ค๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก 'html.parser'๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๊ณ ๋ค๋ฅธ ํ์๋ ์ฌ๊ธฐ ์ฐธ์กฐ
์์ ์ฐพ๊ธฐ
find
์ find_all
(๋งค์ฐ ๋งค์ฐ ์ค์! ์ ํํ ์ดํดํ๊ณ ์๊ธฐ)
- find : bs4์์ 1๊ฐ์ ์์๋ฅผ ์ฐพ์ ๋ ์ฌ์ฉ, ์กฐ๊ฑด์ ์ผ์นํ๋ ์ฒซ๋ฒ์งธ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํด
- find_all : ์ฌ๋ฌ ๊ฐ์ ์์๋ฅผ ์ฐพ์ ๋ ์ฌ์ฉ, ์กฐ๊ฑด์ ์ผ์นํ๋ ๋ชจ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌ์คํธ์ ๋ด์ ๋ฆฌํด
dog_element = soup.find(id='dog')
cat_elements = soup.find_all(class_='cat')
id๋ ์ฃผ๋ก ๋จ์ผ๊ฐ์ฒด์ด๋ฏ๋ก find๋ฅผ ์ฌ์ฉํ๊ณ class๋ ์ฌ๋ฌ ๊ฐ์ฒด๊ฐ ๋ชจ์ฌ์์ผ๋ฏ๋ก find_all์ ์ฌ์ฉํฉ๋๋ค.
์ฃผ์) ์์์ class_ ๋ก ์ฌ์ฉํ ๊ฒ์ ํ์ด์ฌ์ class์ ๊ตฌ๋ถ ์ง๊ธฐ ์ํจ์
๋๋ค.
ํ์ฉ)
cat_elements = soup.find_all(class_='cat')
for cat_el in cat_elements:
cat_el.find(class_='fish') # cat_el[0], cat_el[1] ๋ฑ์ผ๋ก๋ ๊ฐ๋ฅ
ํ๊ทธ์ ํด๋์ค ๋์ ํ์ฉ)
cat_div_elements = soup.find_all('div', class_='cat') # 'div' ํ๊ทธ๋ฅผ ๊ฐ์ง๋ฉด์ ๋์์ 'cat' ํด๋์ค์ธ ๊ฒฝ์ฐ
string ํ์ฉ)
- ์ด๋ค ํน์ ํ ๊ธ์ด ๋ค์ด๊ฐ ์๋์ง ๋ณด๊ณ ์ถ์ ๋์ ๊ฒฝ์ฐ์ ๋๋ค.
soup.find_all(string='raining')
soup.find_all(string=lambda text: 'raining' in text.lower()) # 'raining'์ด ๋์๋ฌธ์ ๊ตฌ๋ถ์์ด ์ฐพ๊ณ ์ถ์ ๋
string ์ ์ฌ์ฉํ๋ฉด ์ํ๋ ์ ๋ณด๋ฅผ ์ฐพ์ ์๋ ์์ง๋ง ๊ฐ ์์์ .string ์์ฑ์ ๋ถ๋ฌ์ค๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์๊ฐ ์๋ ๋ฌธ์์ด๋ก ๋ฆฌํด์ด ๋ฉ๋๋ค. ๋ฐ๋ผ์ ํ๋์ ์์๋ก ๋ฐ๊ธฐ ์ํด์๋ ํ๊ทธ๋ ๊ฐ์ด ์ถ๊ฐํด์ค์ผ ํฉ๋๋ค.
soup.find_all('h3', string='raining') # ํ๊ทธ๋ ๊ฐ์ด ์ ์ฉํด์ผ ํ๋์ ์์๋ก ๊ฐ์ ๋ฐ์ ์ ์์ต๋๋ค.
์ ๋ณด์ป๊ธฐ)
<p class='cat'>This is a p-cat</p>
cat_el = soup.find('p', class_='cat')
cat_el.text #=> 'This is a p-cat'
cat_el.text.strip() # ๋ถํ์ํ ๋์ด์ฐ๊ธฐ๊ฐ ์์ ๋ ์ ๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉ
cat_el.text.split() # ๋ฐ์์จ ๋ฌธ์์ด์ ์ด๋ค ๊ธฐ์ค์ ๋ฐ๋ผ ๋๋ ์ค์ผํ ๋ ์ฌ์ฉ (์์ฃผ ์ฌ์ฉํ๊ฒ ๋๋ค)
+์ฌํ
์ ์ ์คํฌ๋ ์ดํ vs ๋์ ์คํฌ๋ ์ดํ
๊ทธ๋ฆฌ๊ณ
์น ์คํฌ๋กค ๋ด๋ ธ์ ๋, url์ ๊ทธ๋๋ก/๋ด์ฉ๋ฌผ ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ '๋์ ์คํฌ๋ ์ดํ' ~~ ํฌ๋กค๋ง
์น ์คํฌ๋กค ์ฌ์์ ๋, url์ด ๋ณํ๊ณ /๋ด์ฉ๋ฌผ ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ '์ ์ ์คํฌ๋ ์ดํ'
'๐ฟ Data > ๋ถํธ์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL]55. NoSQL (0) | 2022.01.28 |
---|---|
[TIL]54. API (0) | 2022.01.27 |
[TIL]52. Python_Intensive(Debuging, Class) (0) | 2022.01.26 |
[TIL]51. Section3_sprint1_challenge (0) | 2022.01.24 |
[TIL]50.DB_ API (0) | 2022.01.21 |