□ 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 |