본문 바로가기
코딩/파이썬

[파이썬 크롤링] 05 - select, select_one

by 일호15 2023. 1. 31.

안녕하세요! 일호15 입니다!

이 포스팅에 담겨있을 내용을 기대하셨다면 좋겠습니다.

야무지게 준비했거든요. 바로 가시죠!

 

from bs4 import BeautifulSoup
import requests

url = 'https://dlfgh15.tistory.com/category/%ED%8C%8C%EC%9D%B4%EC%8D%AC%20%EC%B2%AB%EA%B1%B8%EC%9D%8C%3A/a%20%3D%20%27%EA%B0%9C%EB%85%90%27'
selector = 'div.inner span.title'  #HTML과 CSS를 알아야 제목 정보를 고를 수 있다.

R = requests.get(url)
B = BeautifulSoup(R.content, 'html.parser')
titles = B.select(selector)

for title in titles:
    print(title.get_text())

크롤링 개요 포스팅에서 살펴본 코드를 바탕으로 하나하나 알아볼게요!

 

>> [파이썬 크롤링] 01 - 개요

 

1 CSS selector

더보기

 

파이썬 기초를 떼었다는 가정 하에, 크롤링에 대한 포스팅들을 남겨두었습니다. requests, BeautifulSoup에 대한 설명도 마친 상태이고요.

 

이제 코드에서 해석이 필요한 부분은 titles = B.select(selector) 부분 뿐이네요! 그런데 이게 제일 어렵습니다ㅎㅎ 왜냐하면 CSS셀렉터에 대한 이해가 필요한 부분이기 때문입니다.

 

 

 

2 select

더보기

 

titles = B.select(selector)

 

select는 해당 조건에 맞는 모든 것을 고르는 메서드입니다. 1개 이상의 결과를 기대하기에, 좌변의 변수명도 titles로 복수 형태로 표기한 모습이고요. 이에 따라 titles는 리스트 데이터타입으로 저장됩니다.

 

이제 파이썬의 영역으로 들어가보겠습니다. titles는 [title1, title2, title3, . . .]의 형태로 저장되는데요. for문과 결합하여 각각의 데이터에 접근하여 무언가를 처리할 수 있을 것만 같은 느낌이네요.

for title in titles:
    print(title.get_text())

 

위 코드가 실행되면, title 변수는 title1, title2, title3, . . . 등의 변수를 순회하며 title1.get_text(), title2.get_text(), title3.get_text(), . . . 를 출력하게 되겠네요. get_text()메서드가 무엇인지 궁금하다면, 스크롤을 맨 위로 올려 예제 코드에서 .get_text() 부분을 지우고 코드를 실행해보신다면 느낌 알게 되실거에요!

 

한가지 살펴볼 점은, 찾고자 하는 title이 한개일때 select 메서드를 사용하면 어떤 상황이 되는가 입니다.

only = B.select(selector)

 

딱 한개 있는 only 요소를 발견하여 크롤링하고자, select 메서드를 썼다고 가정해보겠습니다. 이 때에도 only는 리스트 포맷의 데이터로 저장이 됩니다. 다만 len(only)=1 이 될 것이고요. 이때는 반복문을 쓸 필요는 없겠지만, only.get_text() 메서드를 사용하면 에러가 뜬다는 점이 달라지는데요. get_text() 메서드는 리스트의 메서드가 아닌 문자열의 메서드이기 때문이에요. 이를 해결하기 위해서는 only[0].get_text() 정도로 처리해주면 되겠네요.

 

 

 

3 select_one

더보기

 

이번에는 select_one 메서드에 대해 알아보겠습니다. 이름에서 느낌을 받을 수 있듯이, 딱 하나만 선택한다는 의미입니다. only처럼 딱 한개 있는 것을 선택할 때도 적용할 수 있고, titles처럼 여럿 있는 것들 중 제일 먼저 검거되는 친구를 선택할 때 쓰기도 합니다.

 

title = B.select_one(selector)

 

title는 titles와 달리 문자열 포맷으로 데이터가 저장됩니다. 그리하여 바로 title.get_text()를 써먹을 수 있게 되고요. only를 선택하는 과정에서 select 메서드가 아닌 select_one 메서드를 썼다면, only[0].get_text()가 아닌 only.get_text()를 써주면 되겠네요.

 

참고로 2문단 for문에서의 title3문단에서의 title은 동명이인이에요. 이름만 같고 아예 다른 것임을 이해하고 넘어가셨으면 좋겠습니다! 이는 select, select_one 과 관계가 있겠습니다!

 

 

 

어느것을 고를까요 알아맞혀보세요!

 

 

다음 글 >> [파이썬 크롤링] 06 - 이중 크롤링(?)

반응형

댓글