Computer >> 컴퓨터 >  >> 프로그래밍 >> HTML

파이썬(Python)으로 웹페이지의 HTML 테이블을 CSV 파일로 자동 추출하는 완벽 가이드

문제 상황

데이터 과학자에게 가장 어려운 작업 중 하나는 바로 데이터 수집입니다. 사실 웹에는 방대한 양의 데이터가 이미 존재하지만, 이를 사람이 일일이 복사·붙여넣기 하는 대신 자동화를 통해 효율적으로 추출하는 것이 핵심 과제입니다.

왜 필요한가?

예를 들어 https://www.tutorialspoint.com/python/python_basic_operators.htm 페이지에 포함된 기본 연산자 데이터를 HTML 테이블 형태로 추출하고 싶다고 가정해 봅시다.

만약 페이지에 테이블이 하나뿐이라면 단순히 복사해서 CSV 파일에 붙여넣으면 됩니다. 하지만 한 페이지에 5개 이상의 테이블이 있다면 어떨까요? 수작업으로 처리하는 것은 매우 번거롭고 비효율적일 것입니다.

1단계: CSV 파일 생성 기본기 익히기

먼저 파이썬 내장 모듈인 csv를 사용해 CSV 파일을 손쉽게 만드는 방법부터 살펴보겠습니다.

import csv
# 쓰기 모드로 파일 열기, 없으면 새로 생성됨
File = open('test.csv', 'w+')
Data = csv.writer(File)

# 헤더 작성
Data.writerow(('Column1', 'Column2', 'Column3'))

# 데이터 작성
for i in range(20):
Data.writerow((i, i+1, i+2))

# 파일 닫기
File.close()

실행 결과

위 코드를 실행하면 코드와 같은 디렉터리에 test.csv 파일이 생성됩니다.

파이썬(Python)으로 웹페이지의 HTML 테이블을 CSV 파일로 자동 추출하는 완벽 가이드

2단계: 웹에서 HTML 테이블 가져오기

이제 https://www.tutorialspoint.com/python/python_dictionary.htm 페이지의 HTML 테이블을 가져와 CSV 파일로 저장해 보겠습니다.

가장 먼저 필요한 라이브러리를 임포트합니다.

import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup

url = 'https://www.tutorialspoint.com/python/python_dictionary.htm'
  • urlopen으로 URL을 열어 HTML 내용을 객체에 저장한 뒤, BeautifulSoup으로 파싱합니다.

html = urlopen(url)
soup = BeautifulSoup(html, 'html.parser')
  • HTML 안의 테이블을 찾아 데이터를 가져옵니다. 여기서는 데모를 위해 첫 번째 테이블 [0]만 추출합니다.

table = soup.find_all('table')[0]
rows = table.find_all('tr')

추출된 행(row)들을 확인해 보면 다음과 같습니다.

print(rows)
[<tr>
<th style='text-align:center;width:5%'>Sr.No.</th>
<th style='text-align:center;width:95%'>Function with Description</th>
</tr>,
<tr>
<td class='ts'>1</td>
<td><a href='/python/dictionary_cmp.htm'>cmp(dict1, dict2)</a>
<p>Compares elements of both dict.</p></td>
</tr>, <tr>
<td class='ts'>2</td>
<td><a href='/python/dictionary_len.htm'>len(dict)</a>
<p>Gives the total length of the dictionary...</p></td>
</tr>, ...]

3단계: 추출한 데이터를 CSV로 저장하기

이제 가져온 테이블 데이터를 CSV 파일에 기록합니다. 각 행에서 td, th 태그를 찾아 텍스트만 필터링하는 것이 핵심입니다.

File = open('my_html_data_to_csv.csv', 'wt+')
Data = csv.writer(File)
try:
for row in rows:
FilteredRow = []
for cell in row.find_all(['td', 'th']):
FilteredRow.append(cell.get_text())
Data.writerow(FilteredRow)
finally:
File.close()

결과는 my_html_data_to_csv.csv 파일에 저장됩니다.

전체 코드 정리

지금까지 설명한 내용을 하나의 완성된 코드로 합치면 다음과 같습니다.

import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup

# URL 설정
url = 'https://www.tutorialspoint.com/python/python_basic_syntax.htm'

# URL 열고 HTML 파싱
html = urlopen(url)
soup = BeautifulSoup(html, 'html.parser')

# 첫 번째 테이블 추출
table = soup.find_all('table')[0]
rows = table.find_all('tr')

# 파일에 내용 기록
File = open('my_html_data_to_csv.csv', 'wt+')
Data = csv.writer(File)
try:
for row in rows:
FilteredRow = []
for cell in row.find_all(['td', 'th']):
FilteredRow.append(cell.get_text())
Data.writerow(FilteredRow)
finally:
File.close()

원본 HTML 페이지의 테이블

파이썬(Python)으로 웹페이지의 HTML 테이블을 CSV 파일로 자동 추출하는 완벽 가이드

마무리 및 추가 팁

이처럼 urllibBeautifulSoup을 조합하면 웹페이지의 HTML 테이블을 몇 줄의 코드로 자동 수집할 수 있습니다. 실무에서 활용할 때는 다음 사항도 함께 고려하면 좋습니다.

  • 여러 테이블 처리: soup.find_all('table')이 반환하는 리스트를 반복문으로 순회하면 페이지의 모든 테이블을 한 번에 추출할 수 있습니다.
  • 예외 처리 강화: 네트워크 오류나 잘못된 URL에 대비해 try-except로 HTTP 에러를 처리하세요.
  • pandas 활용: pandas.read_html()을 사용하면 위 과정을 더욱 간결하게 구현할 수 있으며, 바로 DataFrame으로 변환할 수 있습니다.
  • 웹 스크래핑 예절: 대량 요청 시 서버에 부담을 주지 않도록 시간 간격을 두고, 해당 사이트의 이용 약관을 반드시 확인하세요.