크롤링 기초 (2) : 기본 용법 / select

기초/Python|2022. 1. 11. 21:40

태그명과 클래스명 등으로 필요한 부분을 지정하고 데이터를 추출하는 방법 이외에,

select() 라는 함수를 이용하는 방법도 있다. *서로 호환되며 교차 사용이 가능함

*find()와 마찬가지로 결과값은 리스트 형태로 반환된다.

맨 처음 찾은 값만 가져오고 싶을 때는 select_one() 을 써주면 해당 객체만 추출된다.

import requests as req
from bs4 import BeautifulSoup as b
res = req.get('https://www.naver.com/')
soup = b(res.content,'html.parser')

# 태그명은 그냥 따옴표 안에 적어 준다.
somedata = soup.select_one('div') 
# 클래스명을 써줄 때는 . 뒤에 적어 준다.
somedata2 = soup.select('.column_fix_wrap')
# id값을 넣어줄 때는 # 뒤에 적어 준다.
somedata3 = soup.select('#NM_THEMECAST_CONTENTS_CONTAINER')

* 클래스가 여러 개일 경우에는 find()는 스페이스바로 구분,

select()는 .클래스1.클래스2 이런 식으로 .으로 구분하여 이어 적어준다.

 

태그 이름들이 다 비슷해서 특정지을 수 없을 때는?

find()를 두 번 사용했던 것처럼 상위 태그 안의 하위 태그를 지정하여 주고 싶을 때는,

스페이스바(' ')로 띄워서 select()를 사용해 준다.

이 때, 상위/하위인지만 일치하면 되고, 그 사이에 들어오는 모든 태그를 반드시 명시할 필요는 없다.

그 사이에 뭐가 있든.. 상위->하위 어딘가에 있기만 하면 됨!

import requests as req
from bs4 import BeautifulSoup as b
res = req.get('https://www.naver.com/')
soup = b(res.content,'html.parser')
somedata = soup.select_one('div a')
somedata.get_text() # ' 뉴스스탠드 바로가기 '

상위/하위뿐만 아니라 그 사이에 들어오는 모든 태그를 정확히 지정할 때는 꺽쇠('>')를 사용한다.

import requests as req
from bs4 import BeautifulSoup as b
res = req.get('https://www.naver.com/')
soup = b(res.content,'html.parser')
somedata = soup.select('button > span')
# 반드시 button 태그 바로 아래에 span 태그를 가진 데이터를 추출한다.
for something in somedata:
    print(something.get_text())

 

모든 것들을 응용하면..

import requests as req
from bs4 import BeautifulSoup as b
res = req.get('https://www.naver.com/')
soup = b(res.content,'html.parser')

#div태그 내에 id값이 NM_..영역 하위의, h2태그를 가지고 class명이 blind인 부분을 추출한다.
somedata = soup.select_one('div#NM_THEMECAST_CONTENTS_CONTAINER  h2.blind')
somedata.get_text() # '주제별 캐스트'

이런 것도 가능하다.

댓글()