html5lib란 무엇인가?
html5lib는 HTML을 파싱하기 위한 순수 Python 라이브러리입니다. 모든 주요 웹 브라우저가 채택한 WHATWG HTML 표준 사양을 준수하도록 설계되었으며, 브라우저와 동일한 방식으로 텍스트를 해석한다는 점이 가장 큰 특징입니다.
HTML 문서의 거의 모든 요소를 파싱하여 다양한 태그와 조각으로 분해할 수 있고, 용도에 따라 원하는 부분만 필터링해서 활용할 수 있습니다. 또한 깨지거나 불완전한 HTML 태그도 관대하게 처리하며, 문서 구조를 완성하기 위해 필요한 태그를 자동으로 추가해 줍니다. 순수 Python 코드로 작성되어 있어 별도의 컴파일 과정이나 외부 종속성 없이 어디서든 실행할 수 있습니다.
lxml란 무엇인가?
lxml 역시 유사한 파서지만, HTML보다는 XML 기능 중심으로 동작합니다. 내부적으로 외부 C 라이브러리(libxml2 등)에 의존하기 때문에 순수 Python으로 구현된 html5lib에 비해 훨씬 빠른 처리 속도를 자랑합니다.
두 파서의 동작 차이 예제
닫히지 않은 태그가 포함된 간단한 문자열을 두 파서로 각각 파싱하여, 출력 결과의 차이를 직접 확인해 보겠습니다.
from bs4 import BeautifulSoup
html5_structure = BeautifulSoup("<head><li></p>", "html5lib")
print(html5_structure)
lxml_structure = BeautifulSoup("<head><li></p>", "lxml")
print(lxml_structure)
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
출력 결과
<html><head></head><body><li><p></p></li></body></html>
<html><head></head><body><li></li></body></html>
결과 분석: 왜 결과가 다를까?
출력 결과에서 확인할 수 있듯이, html5lib는 브라우저처럼 <p> 태그까지 복원하여 더욱 완전한 형태의 HTML 문서를 생성합니다. 반면 lxml은 XML과 유사한 엄격한 구조에 초점을 맞추기 때문에 제대로 닫히지 않은 <p> 태그를 완전히 무시해 버립니다.
상황별 파서 선택 가이드
- html5lib: 브라우저와 동일한 파싱 결과가 필요하거나, 심하게 깨진 HTML을 최대한 복원해야 하는 경우에 적합합니다. 다만 처리 속도가 느린 편입니다.
- lxml: 대량의 문서를 빠르게 처리해야 할 때 최적의 선택입니다. 실무에서 BeautifulSoup과 함께 가장 널리 사용되는 조합입니다.