การดึงข้อมูลจากตาราง HTML (<table>) บนเว็บเพจและบันทึกเป็นไฟล์ CSV เป็นงานทั่วไปใน Data Scraping ใช้ไลบรารี BeautifulSoup และ csv มาตรฐานของ Python
ขั้นตอนหลัก
- ดึง HTML จาก URL ด้วย
urllib.request.urlopenหรือrequests - Parse HTML ด้วย
BeautifulSoup - ค้นหาแท็ก
<table>ที่ต้องการ - วนลูปอ่าน
<tr>(แถว) และ<td>/<th>(เซลล์) - เขียนลง CSV ด้วย
csv.writer
โค้ดตัวอย่างสมบูรณ์
import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup
# 1. ตั้งค่า URL
url = 'https://www.example.com/page-with-table.html'
# 2. ดึงและ Parse HTML
html = urlopen(url)
soup = BeautifulSoup(html, 'html.parser')
# 3. หาตาราง (ตารางแรก index 0)
table = soup.find_all('table')[0]
rows = table.find_all('tr')
# 4. เปิดไฟล์ CSV เขียน
with open('table_data.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
for row in rows:
# ดึงข้อความจาก th (header) และ td (data)
cells = row.find_all(['td', 'th'])
row_data = [cell.get_text(strip=True) for cell in cells]
writer.writerow(row_data)
print("บันทึก CSV เรียบร้อย!")
สร้างไฟล์ CSV พื้นฐาน (ทดสอบ)
import csv
with open('test.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['Column1', 'Column2', 'Column3']) # Header
for i in range(20):
writer.writerow([i, i+1, i+2])
ข้อควรระวังและปรับปรุง
- หลายตาราง: ใช้
soup.find_all('table')แล้วเลือก index หรือกรองด้วย class/id - Encoding: ระบุ
encoding='utf-8'เพื่อรองรับภาษาไทย - newline='': ป้องกันบรรทัดว่างระหว่างแถวใน Windows
- Error Handling: ใช้ try/except ครอบการดึง URL และ Parse
- Dynamic Content: ห้าเว็บใช้ JS สร้างตาราง ให้ใช้ Selenium แทน urllib
- Headers: บางเว็บบล็อก User-Agent ให้เพิ่ม Header:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...'}
req = urllib.request.Request(url, headers=headers)
html = urlopen(req)
ไลบรารีตัวเลือก
pandas.read_html()- อ่านตาราง HTML ตรงเป็น DataFrame (ง่ายที่สุด)lxml- Parser เร็วกว่า html.parserrequests- HTTP client ที่ใช้ง่ายกว่า urllib
ตัวอย่างด้วย Pandas (แนะนำ)
import pandas as pd
tables = pd.read_html('https://example.com/page.html')
df = tables[0] # ตารางแรก
df.to_csv('table_data.csv', index=False, encoding='utf-8-sig')