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

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

















