웹페이지의 표를 엑셀로 쏙 — 파이썬 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에 기준을 한 줄로 박아 두세요.