웹페이지의 표를 엑셀로 쏙 — 파이썬 read_html

강의 전날, 공공데이터 포털 금리표 페이지를 열고 표를 드래그해 엑셀에 붙여넣다가 열이 밀린 적이 있습니다. 김대리 팀은 이제 pandas.read_html 한 줄로 <table>을 DataFrame으로 받아, to_excel까지 묶었어요.

오늘은 파이썬으로 웹페이지 표를 읽어 엑셀 파일로 저장하는 실무 패턴입니다. merge 여러 엑셀 · groupby 집계와 연결하면 “웹 → 표 → 집계 → 메일” 파이프라인이 됩니다.

이 글을 따라 하면 얻는 것
pd.read_html(url) 기본
– 여러 <table> 중 올바른 인덱스 선택
– 인코딩·User-Agent·SSL 오류 대응
– 엑셀 저장·열 이름 정리

1. 환경 — pandas·lxml

pip install pandas lxml openpyxl

read_html은 내부적으로 lxml 또는 html5lib 파서를 씁니다. Windows 사무실 PC면 lxml이 빠른 편이에요.

2. 기본 — URL 한 줄

import pandas as pd

url = "https://example.com/rate-table"
tables = pd.read_html(url)
print(len(tables), "개 표 발견")
df = tables[0]
df.to_excel("금리표.xlsx", index=False)

tables는 리스트 — 페이지에 표가 여러 개면 [0], [1]을 직접 확인해야 합니다.

3. 표 선택 — 인덱스·attrs

브라우저 개발자 도구(F12)로 <table id="...">를 확인한 뒤:

tables = pd.read_html(url, attrs={"id": "rateTable"})
df = tables[0]

또는 미리보기:

for i, t in enumerate(pd.read_html(url)):
    print(i, t.shape, t.columns.tolist()[:5])

4. User-Agent — 403·빈 결과

일부 사이트는 기본 UA를 막습니다.

import urllib.request

req = urllib.request.Request(
    url,
    headers={"User-Agent": "Mozilla/5.0 (compatible; data-bot/1.0)"},
)
html = urllib.request.urlopen(req, timeout=30).read()
tables = pd.read_html(html)

주의: robots.txt·이용약관을 확인하세요. 개인 학습·내부 보고용과 상업적 크롤링은 다릅니다.

5. 열 이름·타입 정리

웹 표는 헤더가 2행이거나 Unnamed: 0이 붙습니다.

df = tables[0]
df.columns = df.iloc[0]
df = df[1:].reset_index(drop=True)
df["금리"] = pd.to_numeric(df["금리"].astype(str).str.replace("%", ""), errors="coerce")

6. 로컬 HTML 파일

with open("saved_page.html", encoding="utf-8") as f:
    tables = pd.read_html(f.read())

오프라인 백업 후 반복 파싱할 때 유용합니다.

7. 엑셀·다음 단계

df.to_excel("output.xlsx", sheet_name="금리", index=False)

이어서 groupby로 은행별 평균, smtplib로 메일 발송.

8. FAQ

Q. 표가 0개예요.
JavaScript로만 그리는 SPA는 read_html이 실패합니다 — API·수동 export를 검토.

Q. 한글 깨짐?
encoding="utf-8"로 파일 읽기, 또는 response.read().decode("euc-kr").

Q. 엑셀 피벗이랑 뭐가 달라요?
피벗은 엑셀 안에서, read_html은 외부 웹 표를 자동 수집할 때.

9. 연습

1) 위키 표 URL로 read_html 2) 인덱스 출력 3) to_excel 4) 열 타입 numeric 변환.

참고: pandas.read_html · openpyxl 차트.

실무 메모 1

F12로 table id 확인 후 attrs 지정. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 2

SPA 페이지는 read_html 실패 — API 검토. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 3

to_excel 후 열 타입 재확인. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 4

F12로 table id 확인 후 attrs 지정. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 5

SPA 페이지는 read_html 실패 — API 검토. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 6

to_excel 후 열 타입 재확인. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 7

F12로 table id 확인 후 attrs 지정. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 8

SPA 페이지는 read_html 실패 — API 검토. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 9

to_excel 후 열 타입 재확인. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 10

F12로 table id 확인 후 attrs 지정. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 11

SPA 페이지는 read_html 실패 — API 검토. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 12

to_excel 후 열 타입 재확인. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 13

F12로 table id 확인 후 attrs 지정. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 14

SPA 페이지는 read_html 실패 — API 검토. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 15

to_excel 후 열 타입 재확인. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 16

F12로 table id 확인 후 attrs 지정. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 17

SPA 페이지는 read_html 실패 — API 검토. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 18

to_excel 후 열 타입 재확인. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 19

F12로 table id 확인 후 attrs 지정. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 20

SPA 페이지는 read_html 실패 — API 검토. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 21

to_excel 후 열 타입 재확인. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 22

F12로 table id 확인 후 attrs 지정. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 23

SPA 페이지는 read_html 실패 — API 검토. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 24

to_excel 후 열 타입 재확인. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 25

F12로 table id 확인 후 attrs 지정. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 26

SPA 페이지는 read_html 실패 — API 검토. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 27

to_excel 후 열 타입 재확인. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 28

F12로 table id 확인 후 attrs 지정. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 29

SPA 페이지는 read_html 실패 — API 검토. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 30

to_excel 후 열 타입 재확인. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 31

F12로 table id 확인 후 attrs 지정. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 32

SPA 페이지는 read_html 실패 — API 검토. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 33

to_excel 후 열 타입 재확인. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 34

F12로 table id 확인 후 attrs 지정. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 35

SPA 페이지는 read_html 실패 — API 검토. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 36

to_excel 후 열 타입 재확인. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 37

F12로 table id 확인 후 attrs 지정. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

작성자 소개