Post thumbnail

응~ HTML 가져와봐ㅋㅋ Beautiful Soup 쓰면 그만이야: Beautiful Soup를 이용한 HTML 파싱

· by 박승재

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)

.stringElement를 반환하기 때문에, 문자열 타입을 원한다면 str으로 감싸야 합니다.

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

참고: Beautiful Soup Documentation