Py) 크롤링 BS(select)

Py) 크롤링 BS(select)

크롤링한 소스코드를 정제하는 BeatifulSoup를 활용하여 특정 요소에 접근하고자 할 때 사용할 수 있는 .select() 에 대해 알아본다.


개요

requests 또는 Selenium 같은 라이브러리로 특정 페이지의 HTML 소스코드를 가져오거나 API로 XML을 받아온 경우 데이터를 추출하기 위해 원하는 요소(element)에 접근이 필요하다. 이 경우에 사용할 수 있는 것이 BeautifulSoup 라이브러리(이하 bs)로 생성한 객체의 메서드 .select() 이다.

.select()는 HTML 또는 XML의 특정 요소에 접근하기 위해서 CSS 선택자(CSS Selector)를 사용한다.

종류

.select() 메서드와 유사한 메서드로 .select_one()이 있으며 .select()는 CSS 선택자 조건에 맞는 요소 전체를 선택하지만 .select_one()의 경우 CSS 선택자의 조건에 맞는 요소 하나를 선택한다. 그리고 .select()의 반환 객체유형은 리스트 이지만 .select_one()의 경우 BS객체가 반환된다.

예시

다음과 같이 라이브러리와 샘플 코드를 준비한다.

1
2
3
4
5
6
7
8
9
10
from bs4 import BeautifulSoup as bs

source_code = """
<head></head>
<body>
<div data='d1'>aaa</div>
<div>bbb</div>
</body>
"""
bs_source = bs(source_code)

.select()

다음과 같이 .select() 메서드를 사용하여 “div” 태그 요소에 접근하는 코드와 그 결과를 보자.

1
2
bs_source.select("div")
## [<div data="d1">aaa</div>, <div>bbb</div>]

결과는 리스트로 반환되며 해당 리스트의 각 원소는 BS이며 “div”태그와 해당 태그의 하위 내용을 포함한다. 별도로 조작하고자 한다면 다음과 같이 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
ls_1 = bs_source.select("div")
ls_1[0]
## <div data="d1">aaa</div>

ls_1[0].text
## 'aaa'

ls_1[0]["data"]
## 'd1'

[e.text for e in ls_1]
## ['aaa', 'bbb']

.select_one()

단일 BS객체를 반환하는 .select_one() 메서드 사용 예시는 다음과 같다.

1
2
bs_source.select_one("div")
## <div data="d1">aaa</div>

추가 핸들링을 위해서는 다음과 같이 할 수 있다.

1
2
3
4
5
6
bs_1 = bs_source.select_one("div")
bs_1.text
## 'aaa'

bs_1["data"]
## 'd1'
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×