Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> HTML

วิธีบันทึกข้อมูลตาราง HTML เป็น CSV ด้วย Python

การดึงข้อมูลจากตาราง HTML (<table>) บนเว็บเพจและบันทึกเป็นไฟล์ CSV เป็นงานทั่วไปใน Data Scraping ใช้ไลบรารี BeautifulSoup และ csv มาตรฐานของ Python

ขั้นตอนหลัก

  1. ดึง HTML จาก URL ด้วย urllib.request.urlopen หรือ requests
  2. Parse HTML ด้วย BeautifulSoup
  3. ค้นหาแท็ก <table> ที่ต้องการ
  4. วนลูปอ่าน <tr> (แถว) และ <td>/<th> (เซลล์)
  5. เขียนลง 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.parser
  • requests - 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')