1. select_one()
๐ฅ find๊ฐ ์ํ๋ ํ๊ทธ๋ฅผ ์ฐพ๋๊ฒ ๋ชฉ์ ์ด๋ผ๋ฉด select๋ CSS selector๋ก tag ๊ฐ์ฒด๋ฅผ ์ฐพ์ ๋ฐํ
๐ฅ select_one()์ ์ํ๋ ํ๊ทธ ํ๋๋ง ๊ฐ์ ธ์ค๊ณ , ํ๊ทธ๊ฐ ๋ง์ ๊ฒฝ์ฐ์๋ ๋งจ ์์ ๊ฒ๋ง ๊ฐ์ ธ์ด
๐ฐ select ๊ณ์ด์ ๋ฉ์๋๋ css selector ์ด์ฉ ๊ฐ๋ฅ
๐ฐ '.' -> class ์์ฑ / '#' -> id ์์ฑ
๐ฐ class : ํ๋์ html ์์ ์ฌ๋ฌ ํ๊ทธ์ ์ค๋ณต ์ฌ์ฉ ๊ฐ๋ฅ
๐ฐ id : ํ๋์ html์์ ํ๋ฒ๋ง ์ฌ์ฉ. ๊ถ์ฅ์ฌํญ
# ์์ ๋ด text ๊ฐ์ ธ์ค๊ธฐ
title = soup.select_one('title')
print(title.string) # ์ ํ๋ ์์ text๋ง
print(title.text)
print(title.get_text())
# text, get_text๋ ํ์ text ๊น์ง ๊ฐ์ด
1) select_one('ํ๊ทธ๋ช ') ์ฌ์ฉ ์์
# ๋ค์ > ๋ด์ค > IT > ์ค๋์ ์ฐ์ฌ์ ์ฒซ๋ฒ์งธ ๊ธ ์ ๋ชฉ๊ณผ ์ ๋ฌธ์ฌ ๋ค๊ณ ์ค๊ธฐ
url = 'https://news.daum.net/digital#1'
resp = requests.get(url)
soup = bs(resp.text, 'html.parser')
tag_series = soup.select_one(('.list_todayseries li'))
pprint.pprint(tag_series)
tag_series_title = tag_series.select_one('.link_txt').text
print(f'์ ๋ชฉ: {tag_series_title}')
# ์ ๋ชฉ: ์ ์์ฌ์ ์ผ๋ก ์ธ๊ธฐ ๋๋ '์คํ'...์ต๊ทผ์ AI ์๋ฐํ์ ํจ๊ป
tag_series_press = tag_series.select_one('.txt_info').text
print(f'์ ๋ฌธ์ฌ: {tag_series_press}')
# ์ ๋ฌธ์ฌ: ์ ์์ ๋ฌธ
2) select_one('CSS์ ํ์') ์์
import requests
from bs4 import BeautifulSoup as bs
import pprint
# ํ ๋ฆฌ์ค ์ปคํผ : ๋งค์ฅ ๊ฒ์
url = 'https://www.hollys.co.kr/store/korea/korStore2.do'
resp = requests.get(url)
soup = bs(resp.text, 'html.parser')
# ๋งค์ฅ ํ
์ด๋ธ ๊ฐ์ ธ์ค๊ธฐ
stores = soup.select_one('#contents > div.content > fieldset > fieldset > div.tableType01 > table')
pprint.pprint(stores)
๐ ์ผ์ชฝ์ css selector๋ก ๊ฐ์ ธ์จ ๊ฒฐ๊ณผ์ด๋ค
โก๏ธ selector ์์ค๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ html ์์ค์ฝ๋ ์ค ํด๋น ํ๊ทธ ์์ ์ปค์๋ฅผ ๊ฐ์ ธ๋ค ๋๊ณ ์ฐํด๋ฆญ โถ๏ธ ๋ณต์ฌ โถ๏ธ selector ๋ณต์ฌ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋๋ค.
# ์ฒซ ๋ฒ์งธ ๊ฐ๊ฒ ๊ด๋ จ
first_store = stores.select_one('#contents > div.content > fieldset > fieldset > div.tableType01 > table > tbody > tr:nth-child(1)')
pprint.pprint(first_store)
# td:nth-child(1) -> td ํ๊ทธ์ค ์ฒซ๋ฒ์งธ
second_store_name = first_store.select_one('td:nth-child(2)')
print(second_store_name.text)
# ๋ถ์ฐ์ฌ์๊ด์ฅ์
# td:nth-child(1) -> td ํ๊ทธ์ค 4๋ฒ์งธ
second_store_addr = first_store.select_one('td:nth-child(4)')
print(second_store_addr.text)
# ๋ถ์ฐ๊ด์ญ์ ์ฌ์๊ตฌ ๊ด์ฅ๋ก 22 (๊ด๋ฒ๋) 2์ธต ์ฌ์๊ตฌ ๊ด๋ฒ๋ 565-2
2. select()
๐ฅ CSS selector๋ก ์ง์ ํ ํ๊ทธ๋ค์ ๋ชจ๋ ๊ฐ์ ธ์ค๋ ๋ฉ์๋๋ก ๊ฐ์ ธ์จ ํ๊ทธ๋ค์ ๋ชจ๋ ๋ฆฌ์คํธ์ ๋ณด๊ด
# ๋ค์ด๋ฒ ํ์จ ํฌ๋กค๋ง
# ๋ค์ด๋ฒ์์ 'ํ์จ' ๊ฒ์ ํ 'ํ์จ ๋๋ณด๊ธฐ'
url = 'https://finance.naver.com/marketindex'
resp = requests.get(url)
soup = bs(resp.text, 'html.parser')
pprint.pprint(soup)
# ํ์ ๊ณ ์ ๊ตญ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
nations = soup.select('#exchangeList > li > a.head > h3 > span')
print(nations) # ๋ฆฌ์คํธ๋ก ๋ฐํ
# ๋๋ผ๋ณ ํ์จ ๊ฐ์ ธ์ค๊ธฐ
exchange_rates = soup.select('#exchangeList > li > a.head > div > span.value')
print(exchange_rates)
# ๋๋ผ๋ณ ํํ ๋จ์์ ํ์จ ๊ฐ์ด ์ถ๋ ฅํ๊ธฐ
for idx, item in enumerate(nations):
print(f'{item.text} : {exchange_rates[idx].text}')
'''
์คํ๊ฒฐ๊ณผ)
๋ฏธ๊ตญ USD : 1,317.50
์ผ๋ณธ JPY(100์) : 895.98
์ ๋ฝ์ฐํฉ EUR : 1,440.55
์ค๊ตญ CNY : 182.99
'''
3. CSS selector
1) ํ๊ทธ๋ช ์ ํ ex. li, a
test = soup.select('a')
2) ํ์ ํ๊ทธ ์ ํ ex. ul a / ul > a
# ์์ ํ๊ทธ > ํ์ ํ๊ทธ
test = soup.select('li a')
test = soup.select('li > a')
3) ํด๋์ค ์ด๋ฆ์ผ๋ก ์ ํ ex. li.course / .course / li.course.paid
# ํ๊ทธ.ํด๋์ค๋ช
test = soup.select('li.value')
# .ํด๋์ค๋ช
test = soup.select('.value')
# ํ๊ทธ.ํด๋์ค๋ช
.ํด๋์ค๋ช
(์ฌ๋ฌ ํด๋์ค๊ฐ ์๋ ๊ฒฝ์ฐ)
test = soup.select('li.value.fieldset')
4) id ์ด๋ฆ์ผ๋ก ์ ํ ex. #start
# '#id์ด๋ฆ'
test = soup.select('#list50')
# 'ํ๊ทธ๋ช
#id์ด๋ฆ'
test = soup.select('tr#list50')
[ ๋ด์ฉ ์ฐธ๊ณ : IT ํ์ ๊ฐ์ ]