본문 바로가기

카테고리 없음

파이썬 크롤링: BeautifulSoup에서 CSS selector를 사용하는 방법

파이썬에는 BeautifulSoup이라는 HTML 문서 분석 라이브러리가 있습니다. 이를 이용하면 HTML 문서에서 손쉽게 내가 원하는 정보를 추출할 수 있습니다. 오늘은 BeautifulSoup이 제공하는 여러 가지 유용한 기능 중, CSS 선택자를 매개변수로 받는 select() 메서드에 대해서 알아보겠습니다.

 

실습 페이지는 영문 위키피디아의 베네딕트 컴버배치 페이지를 사용하겠습니다. 

 

페이지 불러오기

실습에 필요한 HTML 문서와 soup 객체를 준비합니다.

# 라이브러리를 불러옵니다.
import requests
from bs4 import BeautifulSoup
# 페이지를 받아와 soup 객체로 만듭니다.
url = "https://en.wikipedia.org/wiki/Benedict_Cumberbatch"
html = requests.get(url)
soup = BeautifulSoup(html.text, 'html.parser')

 

select()와 CSS selectors

1. 태그 찾기

soup.select('h1')
# >>> [<h1 class="firstHeading" id="firstHeading" lang="en">Benedict Cumberbatch</h1>]

soup.select('title')
# >>> [<title>Benedict Cumberbatch - Wikipedia</title>]

 

2. 자손 태그 찾기

soup.select('body a')

soup.select('html head title')

 

3. 자식 태그 찾기

soup.select('body p > a')

soup.select('head > title')

 

자손 태그와 자식 태그의 개념을 아래 그려보았습니다. CSS 선택자에서 자손 태그는 공백(white space)으로 자식 태그는 > 기호로 표현합니다. 예를 들어 select('div a')는 div 태그의 자손인 a 태그를 뜻하며, select('div > a')는 div 태그의 자식 태그인 a 태그를 뜻합니다. 이 경우 div 태그의 자식 태그인 a는 존재하지 않기 때문에 빈 리스트를 반환합니다.

 

4. css 클래스(class)로 태그 찾기

# 클래스 명이 infobox인 태그 찾기
soup.select('.infobox')
# 클래스 명이 infobox이면서 biography이면서 vcard인 태그 찾기 (클래스 이름이 세개가 달려있는 태그)
soup.select('.infobox.biography.vcard')

 

5. css 아이디(id)로 태그 찾기

# 아이디가 bodyContent인 태그 찾기
soup.select('#bodyContent')
# 위와 동일한 코드입니다.
soup.select('div#bodyContent')

 

6. 속성(attribute) 값을 이용해서 태그 찾기

# 문서 전체에서 a 태그 중 속성 값 href를 갖은 태그를 찾습니다.
soup.select('a[href]')

# id가 bodyContent인 태그의 자손 태그 중에서 a 태그 속성 값 href를 갖은 태그를 찾습니다.
soup.select('#bodyContent a[href]')

 

뷰티플 수프 select 메서드를 사용하는 6가지 방법에 대해서 알아보았습니다. 주피터 노트북에서 위의 코드를 시키면 결과를 확인할 수 있습니다.

 

 

- 이 글의 코드는 아나콘다(Anaconda3)가 설치된 주피터 노트북에서 작성되었습니다.