推荐优先使用 pandas.read_html() 解析静态网页表格,因其自动处理结构、类型推断和定位;仅当表格混乱(如跨行跨列混用、无ID/class)或需精细控制时,才用 BeautifulSoup 手动解析并注意占位数组、空单元格和编码问题。

直接用 BeautifulSoup 解析表格再手动拼 CSV 是可行的,但容易漏掉跨行(rowspan)、跨列(colspan)单元格,也难处理嵌套标签或空单元格。推荐先用 pandas.read_html() 提取,再用 BeautifulSoup 做兜底或精细控制。
什么时候该用 pandas.read_html() 而不是纯 BeautifulSoup
绝大多数静态网页表格(尤其是有清晰 常见适用场景: 示例: 当表格结构混乱:比如 此时需手动遍历,关键点: 让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript
系统要求
macOS 14+ (Sonoma)
Python 3.9+
需要开启:辅助功能 + 屏幕录制权限 简略示意逻辑: 中文乱码、Excel 打开显示异常,基本都出在这几处: 真正麻烦的是那些合并单元格 + 动态加载 + 表头错位的表格——这时候得结合 结构的),
pandas.read_html() 会自动识别、解析并返回 DataFrame 列表,省去遍历 tr/td 的麻烦,还内置了 header、skiprows、attrs 等过滤参数。
id 或 class(可用 attrs={"id": "my-table"} 精准定位)pandas 自动推断,BeautifulSoup 默认全为字符串)import pandas as pd
dfs = pd.read_html("https://example.com/page.html", attrs={"class": "data-table"})
df = dfs[0] # 取第一个匹配表格
df.to_csv("output.csv", index=False)
必须用
BeautifulSoup 手动解析的几种情况 和 混用、表头在 里、或者
标签被包裹在
pandas.read_html() 可能失败或错位。
soup.find("table", {...}) 定位,别只靠 find_all("table") 硬索引tr,对每个 td 或 th 检查 rowspan/colspan 属性,维护一个二维“占位数组”模拟渲染位置(否则会漏数据)get_text(strip=True) 替代 .text,避免换行符和多余空格)要显式写入 "",否则 CSV 列数会错乱from bs4 import BeautifulSoup
import csv
<p>soup = BeautifulSoup(html, "html.parser")
table = soup.find("table", {"id": "sales-data"})
rows = table.find_all("tr")</p><p>with open("output.csv", "w", newline="") as f:
writer = csv.writer(f)
for row in rows:
cells = row.find_all(["td", "th"])
writer.writerow([cell.get_text(strip=True) for cell in cells])
</p>
to_csv() 常见编码与格式陷阱
encoding="utf-8-sig" —— Excel 默认用系统编码读 UTF-8,不加 BOM 就是乱码;用 "utf-8-sig" 才能正常打开index=False 必须加,否则第一列多出序号,破坏表头对齐csv.writer 默认会用双引号包裹,但若原始文本已有未转义双引号,会导致 CSV 解析错位;建议用 quoting=csv.QUOTE_MINIMAL(默认值)或更安全的 QUOTE_ALL
newline="" 参数,否则 Windows 上会多出空行requests-html 或 selenium 渲染,再喂给 BeautifulSoup,而不是硬刚解析逻辑。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










