응~ 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
는 반대 방향으로 움직입니다.