[자연어처리] BeautifulSoup
0. 들어가면서
Beautiful Soup은 주로 웹 크롤링(web crawling)에 사용되는 라이브러리로 HTML 문서나 XML 문서에서 데이터를 불러오는 데 사용된다. 자연어 처리에서는 원하는 웹페이지를 가지고 온 후에, HTML 태그를 제거하기 위해 사용된다.
1. 설치하기
설치는 아래와 같이 하면 된다.
# conda
$ conda install -c anaconda beautifulsoup4
# colab (python)
$ pip install beautifulsoup4
불러오려면 아래와 같이 import를 하면 된다.
from bs4 import BeautifulSoup
beautifulsoup에는 기본적으로 파이썬 표준라이브러리인 html 파서를 지원하지만, lxml이라는 모듈이 더 빠르게 동작하므로 lxml 모듈도 추가로 설치해 주자.
$ pip install lxml
2. 사용하기
+ 크롤링 관련은 기초단계에서는 생략하겠다.
크롤링을 한다면 우리는 데이터를 많이 모을 것이다. 보통의 데이터는 어느 정도 정제돼 있기 때문에 바로 사용하면 되지만, 일부 텍스트의 경우는 HTML 태그가 그대로 남아있는 경우가 있는데, 이때 BeautifulSoup을 사용하여 HTML 태그를 제거할 수 있다.
data = '<body> 우리는 지금 Hanpy에게 BeautifulSoup을 통한 <b>HTML 태그</b>를 지우는 과정을 배우는 중이다.</body>'
data = BeautifulSoup(data, "html5lib").get_text()
print(data)
------------------------------------------------------------------------------------------------
우리는 지금 Hanpy에게 BeautifulSoup을 통한 HTML 태그를 지우는 과정을 배우는 중이다.
3. 실습
3-1. 데이터 가져오기
beautifulsoup을 사용하기 위해서는 우선은 페이지의 데이터를 가지고 와야한다. 아래와 같이 데이터를 가지고 오면 된다.
# python library
import requests
url = 'https://www.naver.com/'
res = requests.get(url)
위의 res 변수 안에는 page에 관련된 html 태그가 들어있다. 이제 아래와 같이 beautifulsoup을 활용하여 구조화 시킨다.
# python library
import requests
url = 'https://www.naver.com/'
res = requests.get(url)
bs_object = BeautifulSoup(res.content, "lxml", from_encoding='utf-8')
여기까지가 기존적인 준비를 끝낸것이다. 이제 데이터를 뽑아보자
3-2. 데이터 뽑기
네이버 페이지의 html 에서 아래의 meta태그의 content를 뽑아보겠다.
우선은 html의 수많은 테그 중에 내가 원하는 테그를 선택한다.
# python library
import requests
url = 'https://www.naver.com/'
res = requests.get(url)
bs_object = BeautifulSoup(res.content, "lxml", from_encoding='utf-8')
print(bs_object.find('meta', {'name':'description'}))
- bs_object.find('meta', {'name':'description'}) 의 결과값은 아래와 같다.
-
<meta content="네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요" name="description"/>
원하는 태그를 뽑았다. 우리는 다시 content라는 속성의 값을 다시 뽑을 것이다.
# python library
import requests
url = 'https://www.naver.com/'
res = requests.get(url)
bs_object = BeautifulSoup(res.content, "lxml", from_encoding='utf-8')
print(bs_object.find('meta', {'name':'description'})['content'])
'''
# 결과값
네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요
'''
- content 태그를 뽑기 위해 우리는 기존의 코드뒤에 단순히 ['content']만 붙여 주면 된다.
4. 마무리
사실 나도 글을 작성하면서 느끼는 거지만... 이렇게 정리해서 보면 참 쉬운 것 같다. 그러나 실제 코드를 작성하다 보면 헷갈려서 구글링을 한다면 참 어렵게 느껴지니 처음 볼 때 구현까지 꼭 해보자