select 함수를 사용한 추출 데이터 지정

0. 코드 정리

# 정보 추출할 사이트 주소와 데이터 특정할 인자 수정해 사용할 것 

import requests
from bs4 import BeautifulSoup
res = requests.get('정보 추출할 사이트 주소')
soup = BeautifulSoup(res.content,'html.parser')

# 데이터 특정 위한 인자 예시, 하단 설명 참고 
section = soup.select('p.item_title > a > span.prName_PrName')

for item in section:
    print(item.get_text())    #select() 함수는 리스트값을 결과로 입력하여 for 반복문을 통해 추출

1. 데이터 지정 간 select 함수를 사용하는 이유

: 정제되지 않은 웹사이트를 대상으로 상황에 맞는 크롤링 구문을 작성하다보니 크롤링 문법이 다른 문법에 비해 직관적이지 않게 보이는 특성이 있다. 그에 따라 보다 다양한 방법을 사전에 알고 있어야 다른 사람의 코드를 참조할 수 있는데 find()를 이용한 함수만큼 혹은 그 이상 사용되는 것이 select() 함수이다. find() 함수가 상대적으로 이해하기 쉬운 특징이 있는 반면 select() 함수는 보다 더 구체적인 구문을 특정하는데 용이하다는 특징이 있어 실제적으로 더 많이 이용되고 있다.

 

2. select 함수의 기본 사용 형태와 인자 작성법

1) 기본적인 사용 형태

: find() 함수와 기본적으로 사용 형태가 비슷해 보이지만 select() 함수의 경우 결과값을 받는 형태와 안에 들어가는 인자가 달라진다는 점에 유의해 사용해야 한다. find() 함수의 경우 결과값을 객체(object)로 받아 여러개의 값을 가져올 경우 find_all() 함수로 대체 사용해야 했다. 하지만 select() 함수의 경우 결과값을 기본적으로 리스트 형태로 받기 때문에 오히려 하나의 값에 대한 객체(object)로 받고자 할 때 select_one()이라는 함수로 대체 사용해야 하는 특징이 있다. 

# find()와 select() 함수는 호환이 가능한데, 정보 타입에 따라 select() 함수는 find_all() 함수와 select_one()함수는 find()함수와 교차사용이 가능하다. 

import requests
from bs4 import BeautifulSoup
res = requests.get('https://www.okmall.com/products/list?cate=20008603&gi_num=2')
soup = BeautifulSoup(res.content,'html.parser')

section = soup.select('p.item_title > a > span.prName_PrName') # find() 대신 select() 사용

for item in section:
    print(item.get_text())    #select() 함수는 리스트값을 결과로 입력하여 for 반복문을 통해 추출

 

2) select() 함수 인자 작성법

: select() 함수 내 인자를 작성할 때에는 CSS 언어의 style 태그가 HTML 태그를 취할 때의 문법 구조와 동일하게 작성된다. tag 값은 별도의 표시 없이 값만 가져오며 class 값은 앞에 "."과 함께 그리고 id 값은 앞에 "#"과 함께 쓰인다. 동일한 태그 내의 정보를 중복으로 사용 가능하며 이런 구문을 작성할 때에는 띄어쓰기 없이 붙여 사용해야 한다.

#tag 값 : tag 값 입력
#class 값 : .class 값 입력
#id 값 : #id 값 입력

import requests
from bs4 import BeautifulSoup
res = requests.get('https://www.okmall.com/products/list?cate=20008603&gi_num=2')
soup = BeautifulSoup(res.content,'html.parser')

section = soup.select('태그값.class값#id값') #단일 태그 안에 있는 정보를 기입할 떄에는 붙여서 사용 

for item in section:
    print(item.get_text())

또한 selcet()함수는 보다 구체적으로 특정 데이터를 특정하기 위해 상위 태그 정보를 함께 기입하는 방법도 존재한다. 기본적으로 띄어쓰기를 통해 상위태그와 하위태그 정보를 연속적으로 나열 가능하며 바로 앞에 있는 상위 태그임을 나태내고 싶다면 띄어쓰기 대신 ">" 기호를 추가할 수 있다. 다만 ">" 기호를 사용할 경우 바로 앞에 위치한 상위태그가 정보가 아닐 시에는 정보 추출이 제한된다는 점에 유의해야 한다.

#상위 태그 포함 예시
section = soup.select('태그명.class명 태그명#id명 > 태그명.class명' )

 

3) select() 함수 인자 추출 방법

: 웹페이지 내 '검사' 기능을 사용한다면 크롤링을 통해 추출하고자 하는 정보의 CSS selector 정보를 즉시적으로 복사할 수 있다. 웹페이지 검사 기능 내 원하는 정보가 담긴 구문을 우클릭한 후 'Copy' 안에 'Copy Selector'를 클릭한 뒤 해당 정보를 select() 함수 인자로 사용 가능한 정보를 추출 가능하다.

 

# 검사 기능 내 CSS selector 정보 카피하는 방법 이미지 

+ Recent posts