본문 바로가기
TOP
데이터 스킬업/웹크롤링

[파이썬: 웹크롤링] #06 html/CSS 선택자로 테이터 추출하기 with Select & Find

by 티챠림 2023. 3. 1.

[왕초보 웹크롤링 무작정 따라하기] 파이썬 반복문(for문),  .select(), .find(), html 추출, 태그 추출, 선택자 추출, 필터링.


#06 html/CSS 선택자로 테이터 추출하기


select()와 find() 메소드 (바로가기 click)

find()로 필터링하기(바로가기 click)


이전에 select() 메소드를 활용해 크롤링을 했을 때, 경로가 중복되는 문제로 인해 불필요한 데이터까지 받아와졌다. 이번에는 중복되는 선택자를 제거하고 필요한 정보만 필터링 해보자.

동일한 구조로 배치되어 있는 2가지 데이터

 

우선 필터링을 하기 위해서는 각 요소를 선택하는 메소드 select()find()에 대해 알아야한다. 어떻게 쓰느냐에 따라 동일한 경로에 있는 선택자 모두를 선택할 수 있고, 하나만 선택할 수 있기 때문이다. 원하는 경로의 선택자 1개만 뽑아낼 수 있다면 이전에 선택자 중복 문제로 실패했던 크롤링은 해결할 수 있다.

 

 

  .select()와 .find() 메소드 알아보기

.select().find() 모두 특정 경로의 정보를 가져다주는 메소드들다. 이 둘은 동일한 용도이지만 선택자 경로를 지정하는 방법에 차이가 있다.

.select() (괄호 안)의 조건에 해당하는 <태그>를 모두 추출
.find()_all (괄호 안)의 조건에 해당하는 <태그>를 모두 추출
.select_one() (괄호 안)의 조건에 해당하는 <태그> 하나를 추출
.find() (괄호 안)의 조건에 해당하는 <태그> 하나를 추출

 

.select()의 선택자 경로 지정 방법

<태그> .select('태그')  
class="클래스" .select('.클래스') .(마침표)는 class를 나타내는 기호
id="아이디" .select('#아이디') #(샵)은 id를 나타내는 기호
<태그 class="클래스">  .select('태그.클래스') 태그에 class가 설정되어 있을 때 붙여씀
<태그1> 직속 하위 <태그2> .select('태그1>태그2') > (꺽쇠)는 속성의 상하관계를 표시
<태그1> 하위의 어딘가의 <태그2> .select('태그1 태그2') (띄워쓰기)
<태그1 class="클래스">
하위의 <태그2> 
.select('선택자.클래스 > 선택자2')  

 

.find()의 선택자 경로 지정 방법

<선택자> .find_all('선택자')  
복수의 <선택자> 중 하나라도 포함한 값  .find_all(['선택자','선택자',...]) [대괄호] 안에 복수의 <선택자> 입력
class="클래스" .find_all(class_="클래스") 속성 class_="" 를 사용
id="아이디" .find_all(id="아이디") 속성 id="" 를 사용
<선택자>이면서
class="클래스" 이고
id="아이디"인 값 
.find_all('선택자', class_="클래스", id="아이디")  

 

두 메소드의 기능 또한 크게 다르지 않지만 .find()을 이용해 참/거짓 조건을 넣어 필터링할 수 있다.

모든 태그 값 추출 .find_all(True)  
<태그>이면서
class가 지정되 있지 않고
id="아이디"인 값 추출
.find_all('태그', class_=Falseid="아이디") False 변수를 사용해
특정 값을 제외

 

 

  .find() 메소드로 조건에 맞는 선택자 경로 지정하기(필터링)

이전에 작성한 코드은 중복되는 태그가 문제였다. 개발자도구를 통해 확인해보니 '프로그램명'이 위치한 <td>태그에는 class가 없지만 '채널'의 <td>태그에는 있는 것을 발견했다. 즉, 프로그램명만 추출하기 위해서 앞서 배운 find_all('선택자', class=False)를 통해 class가 없는 '<td>' 경로만 선택해주면 된다. 기존의 .select('td > p >a')를 지우고 .find_all('td'class_=False)으로 <td>태그 중 class를 포함하는 값을 제외켰다. 코드를 실행시키니 결과창에 '프로그램명'만 성공적으로 추출되었다! 이제 남은 '순위'와 '시청률'을 추출해 주자.

import requests
from bs4 import BeautifulSoup

response = requests.get("https://search.naver.com/search.naver?where=nexearch&sm=tab_etc&mra=blUw&qvt=0&query=%EC%A3%BC%EA%B0%84%EC%98%88%EB%8A%A5%20%EC%8B%9C%EC%B2%AD%EB%A5%A0")
html_data = BeautifulSoup(response.text, 'html.parser')
program_names = html_data.find_all('td', class_=False)

for tag in program_names:
	print(tag.get_text())

 

 

▼다음편 이어보기▼

 

[파이썬: 웹크롤링] #07 리스트 슬라이싱과 for문 필터링 with 파이썬

[왕초보 웹크롤링 무작정 따라하기] 파이썬 반복문(for문/폴문), 리스트(list), 리스트 슬라이싱, 홀수/짝수 제거. 불린함수, if함수 업무지옥을 탈출한 건에 대하여(feat.업무자동화) #5 리스트 슬라

charimlab.tistory.com

댓글