응~ HTML 가져와봐ㅋㅋ Beautiful Soup 쓰면 그만이야: Beautiful Soup를 이용한 HTML 파싱
Beautiful Soup는 Python의 대표적인 HTML 파싱 라이브러리입니다.
Beautiful Soup를 이용하면 웹 브라우저의 자바스크립트에서 document.querySelector처럼, CSS Selector를 이용해 HTML 내의 구성요소에 접근하고 수정할 수 있습니다.
때문에 Requests 라이브러리를 이용해 가져온 HTML 데이터에서 필요한 값을 추출하는 용도로 사용하곤 합니다.
그럼 PyPI를 이용해 라이브러리를 설치해봅시다.
$ pip install beautifulsoup4
아래와 같이 코드에 import 합니다.
from bs4 import BeautifulSoup
HTML 문자열을 입력으로 주어 soup 객체를 생성합니다.
soup 객체에는 파싱된 HTML 데이터가 담기게 됩니다.
soup = BeautifulSoup(str_html, 'html.parser')
‘html.parser’ 대신
lxml을 이용하면 더 빠른 분석이 가능합니다.단,
lxml을 이용하기 위해서는 별도의 라이브러리 설치가 필요합니다.$ pip install lxml
select 함수는 CSS Selector를 이용해 HTML 내의 구성요소에 접근합니다.
rows = soup.select('tbody:not(.hide) > tr')
이때 결과 값은 배열로 반환됩니다.
최초로 만족하는 하나의 원소만 가져오고 싶을 때는 select_one을 이용할 수 있습니다.
anchor = row[0].select_one('a.link')
get은 구성요소의 속성(Attribute)을 가져오는 함수입니다.
url = anchor.get('href')
구성요소 안의 내용을 가져올 때는 .string을 사용합니다.
title = str(anchor.string)
.string은 Element를 반환하기 때문에, 문자열 타입을 원한다면str으로 감싸야 합니다.
next_sibling과 next_element를 이용하면 HTML 구성요소 전후로 이동할 수 있습니다.
<h1>Hi</h1>
<p>Hello</p>
h1 = soup.select('h1')
print(h1.next_sibling) # <p>Hello</p>
print(h1.next_element) # Hi
previous_sibling과 previous_element는 반대 방향으로 움직입니다.