본문 바로가기

카테고리 없음

[파이썬] CSS selector를 이용해서 데이터를 스크래핑하기: select(), select_one()

이번에는 CSS selector를 이용해서 데이터를 추출하는 방법을 알아보겠습니다. CSS는 HTML 요소의 스타일을 정의한 문서입니다. 그렇다면 어떤 요소에 어떤 스타일을 주어야하는지 명확하게 지정할 필요가 있겠죠. 이러한 목적으로 사용되는 것이 selector(선택자)입니다.

 

selector {
    property1: value1;
    property2: value2;
}

CSS는 위와 같이 선택자를 쓰고 { } 괄호 안에 프로퍼티와 값을 지정하는 방식으로 사용합니다.

 

1. 태그 선택자 

사용법

# 태그 이름이 tag1인 html요소를 리스트 형태로 모두 반환합니다. 
soup.select('tag1')
# 태그 이름이 tag1인 html요소중 첫번째 요소만 반환합니다.
soup.select_one('tag1')

 

2. id 선택자

id 값을 중복되지 않는 유일한 값입니다. 따라서 내가 추출하고자하는 html요소에 id 값이 존재한다면 더 쉽게 선택할 수 있습니다.

 

사용법

# id 이름이 id1인 html요소를 리스트 형태로 모두 반환합니다. 
soup.select('#id1')
# id 이름이 id1인 html요소중 첫번째 요소만 반환합니다.
soup.select_one('#id1')

✔ id 이름 앞에는 꼭 #을 붙여줘야합니다.

 

3. class 선택자

class 값은 중복해서 사용할 수 있습니다. 웹 사이트 하나에 같은 class 이름을 갖은 여러개의 html 요소가 존재할 수 있습니다.

 

사용법

# class 이름이 class1인 html요소를 리스트 형태로 모두 반환합니다. 
soup.select('.class1')
# class 이름이 class1인 html요소중 첫번째 요소만 반환합니다.
soup.select_one('.class1')

✔ class 이름 앞에는 꼭 .를 붙여줘야합니다.

 

4. 자식/하위 요소 선택자

사용법

# 자식 요소만 선택합니다.
# > 문자를 사용합니다.
soup.select('tag1 > tag2')
soup.select('tag1 > .class1')

# 하위 요소를 선택합니다.
# 띄어쓰기를 사용합니다.
soup.select('tag1 tag2')
soup.select('.class1 .class2')

 

예제

G마켓 BEST 페이지에서 2번째로 잘팔리는 상품의 이름을 추출해보겠습니다.

import requests
from bs4 import BeautifulSoup
url = "http://corners.gmarket.co.kr/Bestsellers"
r = requests.get(url)
# HTML 코드를 bs4 객체 형태로 변환합니다.
# 이제 손쉽게 원하는 정보를 탐색할 수 있습니다.
soup = BeautifulSoup(r.text, 'html.parser')

best = soup.select('.best-list')[1]
ranked_second = best.select('ul > li')[1]
ranked_second.select_one('.itemname').string
# >>> '[스타벅스]컵커피 스키니라떼 200mlX10컵 X우드트레이+전용포장'

✔ 팁: 크롬브라우저에서 F12 키를 누르면 현재 페이지의 html 요소를 살펴볼 수 있는 개발자도구 화면이 열립니다. 자세한 사용법은 링크를 참고해주세요.

 

5. 다중 조건 선택자

# tag 이름이 tag1인 모든 html 요소를 선택합니다.
soup.select('tag1')

# class 이름이 class1인 모든 html 요소를 선택합니다.
soup.select('.class1')

# class 이름이 class1이면서 class2인 모든 html 요소를 선택합니다.
soup.select('.class1.class2')

# tag 이름이 tag1이면서 class 이름이 class1인 모든 html 요소를 선택합니다.
soup.select('tag1.class1')

 

 

-이 글은 아나콘다(Anaconda3)가 설치된 환경을 기준으로 작성되었습니다.