본문 바로가기
Python/Python_Crawling

css selector

by Mr.DonyStark 2023. 12. 20.

□ select()

  ○ select() 안에 태그 또는 CSS class 이름 등을 넣음
  ○ 결과값은 리스트 형태로 반환
  ○ 매칭되는 첫번째 데이터만 얻고자 할 때는 select_one(), 이 때는 해당 아이템의 객체가 리턴됨
  ○ 하위태그
     - '상위태그 하위태그' : 상위에서 하위태그에 있는 모든 값을 출력
     - '상위태그>하위태그' : 상위기준 바로 하위에있는 태그 값 출력*반드시 상/하위로 구성된 태그일때만 사용가능

select_one()
  ○ 리스트형태가 아닌 단하나의 객체로 출력
  ○ 조건에 맞는 값들이 다른 값들이 많아도 첫번째 값만 출력
*find()/select()로 가져온 객체에는 find()/select()함수를 중복하여 사용가능함

 

#라이브러리 추출
import requests
from bs4 import BeautifulSoup

#크롤링 대상 사이트 지정
target_place = requests.get('https://davelee-fun.github.io/blog/crawl_html_css.html')
#htmlparser 실행 : html.parser
use_tool = BeautifulSoup(target_place.content, 'html.parser')

#태그사용 : Select 함수 사용
list_select = use_tool.select('li')
print(list_select)

for v in list_select:
    print(v.get_text())

print('\n\n################################################\n\n')
#하위태그사용 ex) 사위태그 ul 하위태그 li
lower_tag = use_tool.select('ul li')
for v2 in lower_tag:
    print(v2)

print('\n\n################################################\n\n')

#하위태그사용 ex) 사위태그 ul > 하위태그 li
top_bottom_tag_1 = use_tool.select('ul > a') #ul 상윝태그부터 하위태그로 a가 있다면 사용

if top_bottom_tag_1 == list():
    print('ul > a\t:\tul태그 밑에 a태그가 없음')
else:
    print('ul > a\t:\tul태그 밑에 a태그가 있음')

top_bottom_tag_2 = use_tool.select('li > a') #ul 바로밑에 a태그가 있다면 사용
if top_bottom_tag_2 == list():
    print('li > a\t:\tul태그 밑에 a태그가 없음')
else:
    print('li > a\t:\tul태그 밑에 a태그가 있음')
a = 0
for v3 in top_bottom_tag_2:
    a+=1
    print(f'{a}\t번째\t{v3}')
    print(f'{a}\t번째\t{v3.string}')

print('\n\n################################################\n\n')

#클래스이름으로 검색 : .클래스이름
class_nm = use_tool.select('.course')
for v4 in class_nm:
    print(v4.string)

print('\n\n################################################\n\n')

#ID로 검색 : #id명
id_nm = use_tool.select('#dev_course_list')
for v5 in id_nm:
    print(v5.get_text())

print('\n\n################################################\n\n')

#클래스명에 스페이스가 있는경우 ex)홍길 동 → '.홍길.동'
space_class = use_tool.select('.course.paid')
print(space_class)

print('\n\n################################################\n\n')

#복합사용 
#ul태그이면서 클래스명이 dec_course_list이고 하위 태그인 li태그 중 클래스명이 course paid이며 id값은 advance 인것
mix_use_1 = use_tool.select('ul#dev_course_list li.course.paid#advance')
for vv in mix_use_1: #select을 사용하면 리스트형태로 받으므로 for문활용
    print(vv.get_text())

mix_use_2 = use_tool.select_one('ul#dev_course_list > li.course.paid') #select_one은 리스트가 아닌 데이터로 출력됨
print(mix_use_2.get_text())

print('\n\n################################################\n\n')

#tr/td 태그 가져오기
td_data = use_tool.select('td')
for value_1 in td_data:
    print(value_1.get_text())

print('\n\n################################################\n\n')

tr_data = use_tool.select('tr')
for value_2 in tr_data:
    columns = value_2.select('td')
    row_str = ''
    for column in columns:
        row_str += '/' + column.get_text()
    print(row_str)

'Python > Python_Crawling' 카테고리의 다른 글

반복문을 활용한 페이지별 크롤링  (1) 2023.12.21
크롤링 예제 4  (1) 2023.12.20
크롤링 예제 3  (0) 2023.12.19
크롤링 예제 2  (0) 2023.12.19
크롤링 예제 1  (0) 2023.12.19