Django에서 HTML 태그 추출하기 - Beautiful Soup

Beautiful Soup은 무엇인가?

BeautifulSoup(이하 bs4)는 XML과 HTML형식으로 된 문서를 분해할 수 있는 분해기(Parser)입니다.

직관적이고 굉장히 쉽게 사용할 수 있다는 장점이 있습니다.

원하는 HTML 태그를 검색/추출 및 수정하는데 긴 코드가 필요없습니다.

elements = BeautifulSoup("<title>TITLE</title><p>exmaple</p>", 'html.parser')
elements.title.get_text() # TITLE이 문자열로 리턴됩니다.

위처럼 직관적으로 간단하게 HTML 태그 및 태그의 속성값까지 다룰 수 있습니다.

bs4와 비슷한 라이브러리로는 유명한 lxml이 있습니다.

lxml은 C로 만들어졌기 때문에 성능에 최적화 되어 있습니다.


위의 bs4 공식 문서에서도 확인할 수 있듯이 성능이 중요한 프로젝트에서는 lxml을 사용하기를 권장하고 있습니다.

하지만 bs4는 백엔드 Parser로 lxml을 사용할 수 있도록 지원하고 있습니다.

또한, lxml보다 bs4가 더 직관적이고 사용하기 쉽기 때문에 특별한 이유(문서 해석시간이 매우 중요한 프로젝트의 경우)가 없으면 bs4를 사용하는 것이 좋은 선택일 수 있습니다.


HTML Parsing하기

BeautifulSoup(이하 bs4)을 활용하면 HTML 형식으로 되어있는 문자열을 분해(Parsing)할 수 있습니다.
bs4는 HTML 뿐만 아니라 대중적으로 많이 쓰이는 XML 형식도 분해가 가능합니다.
분해 후에 특정 태그를 찾거나, 태그의 속성값을 가져오거나 수정하는 작업도 할 수 있습니다.

# python
html_contents = '<img src="http://example.com/image1.jpg"><p>exmaple image</p>'
elements = BeautifulSoup(html_contents, 'html.parser')
for img in elements.find_all('img'): # HTML에서 img 태그를 모두 찾습니다.
# img는 Tag타입입니다.
src = img.get('src') # img 태그에서 src 속성값을 가져옵니다.
txt = img.get_text() # img 태그값을 문자열로 가져옵니다.

위의 코드에서는 HTML 형식으로 이루어진 문자열을 분해하여 이미지 태그의 정보만 추출하는 코드입니다.

BeautifulSoup에 매개변수로 HTML 형식의 문자열과 어떤 해석기를 쓸 것인지를 넣어주면 분해가 완료된 List 형태로 반환됩니다.

이 리스트에서 태그들을 순회할 수 있고 각 태그별 속성값들에 대한 정보도 가져올 수 있습니다.

위의 예제에서처럼 특정 태그만 추출하는 것도 가능합니다.

Element 속성값 바꾸기

for img in elements.find_all('img'):
# Tag에 attrs dict형입니다.
# 이 속성에는 해당 태그의 속성값들에 대한 정보가 포함되어 있습니다.
# src, width, height, etc...
img.attrs.update({'src':"new_url"})

modified_html_contents = elements.prettify() # prettify() 메서드를 사용하면 파싱된 HTML 태그들이
# 모두 합쳐진 문자열로 리턴됩니다.

분해된 Element 리스트에는 Tag들이 들어있습니다.

이 Tag 타입은 여러가지 속성들을 가지고 있습니다.

그 중 attrs는 해당 태그의 속성값들에 대한 정보를 가지고 있습니다.

예를 들면, img 태그의 속성값인 width, height, src값들이 attrs에 포함되어 있습니다.

이 값은 Dict 자료형으로 되어있기 때문에 update() 메서드를 통해 수정이 가능합니다.

위의 예시에서는 img 태그의 src값을 수정하고 있습니다.

수정이 모두 끝나면 수정된 HTML 문서를 문자열로 변환할 수 있습니다.

변환된 정보를 가진 Element 리스트를 문자열로 변환하는 메서드가 prettify()입니다.

이 메서드를 사용하면 깔끔하게 리스트 형태의 태그들을 HTML 문서로 전환할 수 있습니다.

댓글()