Python에서 HTML 처리가 가능할까?
네, 가능합니다. Python은 html.parser 모듈에 포함된 HTMLParser 클래스를 사용하여 HTML 파일을 처리할 수 있습니다. 이 클래스는 HTML 태그의 종류와 위치 등 다양한 속성을 감지할 수 있으며, HTML 파일 안에 담긴 데이터를 식별하고 추출하는 기능도 함께 제공합니다.
커스텀 파서 클래스 만들기
아래 예제에서는 HTMLParser 클래스를 상속받아 자신만의 커스텀 파서 클래스를 만드는 방법을 살펴봅니다. 이렇게 만든 파서는 클래스 안에서 정의한 태그와 데이터만 골라서 처리하며, 여기서는 시작 태그(start tag), 종료 태그(end tag), 데이터(data) 세 가지를 다룹니다.
각 핸들러 메서드의 역할은 다음과 같습니다.
handle_starttag(): 시작 태그를 만났을 때 호출됩니다.handle_endtag(): 종료 태그를 만났을 때 호출됩니다.handle_data(): 태그 사이의 텍스트 데이터를 만났을 때 호출됩니다.
또한 getpos() 메서드를 사용하면 현재 처리 중인 요소가 몇 번째 줄의 몇 번째 위치(오프셋)에 있는지 확인할 수 있습니다.
파싱 대상 HTML 파일
다음은 Python 커스텀 파서로 처리할 HTML 파일입니다.
<html> <br> <head> <br> <title>welcome to Tutorials Point!</title> <br> </head> <br> <body> <br> <h1>Learn anything !</h1> <br> </body> <br> </html>
파서 프로그램 코드
위 HTML 파일을 읽어 들인 뒤, 커스텀 파서 규칙에 따라 결과를 출력하는 전체 프로그램입니다.
from html.parser import HTMLParser
import io
class Custom_Parser(HTMLParser):
def handle_starttag(self, tag, attrs):
print("Line and Offset ==", HTMLParser.getpos(self))
print("Encountered a start tag:", tag)
def handle_endtag(self, tag):
print("Line and Offset ==", HTMLParser.getpos(self))
print("Encountered an end tag :", tag)
def handle_data(self, data):
print("Line and Offset ==", HTMLParser.getpos(self))
print("Encountered some data :", data)
parser = Custom_Parser()
stream = io.open("E:\\test.html", "r")
parser.feed(stream.read())파일을 열고 feed() 메서드에 파일 내용을 넘겨주면, 파서가 HTML을 한 줄씩 분석하면서 정의된 핸들러 메서드들을 순서대로 호출합니다.
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Line and Offset == (1, 0) Encountered a start tag: html Line and Offset == (1, 6) Encountered some data : Line and Offset == (2, 0) Encountered a start tag: head Line and Offset == (2, 6) Encountered some data : Line and Offset == (3, 0) Encountered a start tag: title Line and Offset == (3, 7) Encountered some data : welcome to Tutorials Point! Line and Offset == (3, 34) Encountered an end tag : title Line and Offset == (3, 42) Encountered some data : Line and Offset == (4, 0) Encountered an end tag : head Line and Offset == (4, 7) Encountered some data : Line and Offset == (5, 0) Encountered a start tag: body Line and Offset == (5, 6) Encountered some data : Line and Offset == (6, 0) Encountered a start tag: h1 Line and Offset == (6, 4) Encountered some data : Learn anything ! Line and Offset == (6, 20) Encountered an end tag : h1 Line and Offset == (6, 25) Encountered some data : Line and Offset == (7, 0) Encountered an end tag : body Line and Offset == (7, 7) Encountered some data : Line and Offset == (8, 0) Encountered an end tag : html