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')

html 소스

 

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}')
# 신문사: 전자신문

tag_series 실행결과

 


 

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')

매장 테이블의 html 소스

 

# 매장 테이블 가져오기
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)

 

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 학원 강의 ]

+ Recent posts