
网页里的信息很多但表格是最特殊的一种——它天生就是结构化数据一行一行、一列一列排好了抓下来直接就能用存成 CSV 打开就是整齐的表格。今天教两种方法方法一BeautifulSoup 手动解析——灵活什么表格都能搞定方法二pandas.read_html一键提取——懒人福音一行代码先看 HTML 表格长什么样一个标准表格的结构tabletheadtrth排名/thth电影名称/thth评分/thth年份/th/tr/theadtbodytrtd1/tdtd肖申克的救赎/tdtd9.7/tdtd1994/td/trtrtd2/tdtd霸王别姬/tdtd9.6/tdtd1993/td/tr/tbody/table关键标签记一下标签意思table整个表格thead表头部分tbody表体真正的数据在这tr一行th表头单元格td普通数据单元格抓表格的思路就一句话先找到 table一行一行读每行再一格一格读。方法一BeautifulSoup 手动解析基本思路requests拿到网页 HTML找到目标table提取表头th当列名遍历每行tr提取td内容组装成 DataFrame核心代码frombs4importBeautifulSoupimportpandasaspd# 假设 html 是 requests.get(url).text 拿到的网页源码soupBeautifulSoup(html,lxml)tablesoup.find(table,class_movie-rank)# 找到目标表格# 第一步提取表头headers[]theadtable.find(thead)ifthead:header_rowthead.find(tr)headers[th.get_text(stripTrue)forthinheader_row.find_all(th)]else:# 没有 thead 就取第一行当表头first_rowtable.find(tr)headers[c.get_text(stripTrue)forcinfirst_row.find_all([th,td])]# 第二步提取数据行tbodytable.find(tbody)rowstbody.find_all(tr)iftbodyelsetable.find_all(tr)[1:]data[[c.get_text(stripTrue)forcinrow.find_all(td)]forrowinrows]# 第三步转成 DataFrame 并保存dfpd.DataFrame(data,columnsheaders)print(df)df.to_csv(movie_rank.csv,indexFalse,encodingutf-8-sig)两个小细节get_text(stripTrue)自动去掉文字首尾的空格换行表格数据干净很多没有thead的表格把第一行当表头兜底不崩方法二pandas.read_html 一键提取如果你能少写一行就绝不多写这个方法你会爱上——一行代码把页面所有表格全提取出来。importpandasaspd# 就一行直接从 URL 提取所有表格返回 DataFrame 列表tablespd.read_html(目标网页地址)print(f页面上找到{len(tables)}个表格)dftables[0]# 取第一个表格print(df.head())不用 BeautifulSoup不用遍历 tr/tdpandas 全包了。注意事项坑1. 返回的是列表不是单个 DataFrame。页面上可能有好几个表格打印每个的行数列数来判断哪个是你要的。2. 需要装 lxmlpipinstalllxml3. 只能抓静态表格。JS 动态加载的表格read_html抓不到后面会讲怎么处理动态网页。4. 表头识别可能不准手动指定tablespd.read_html(url,headerNone)dftables[0]df.columns[排名,名称,评分,年份]两种方法怎么选场景推荐方法原因表格规整、简单pandas.read_html快几行代码只要文字数据pandas.read_html省事有合并单元格BeautifulSoup 手动pandas 处理不了复杂结构要提取链接、图片BeautifulSoup 手动read_html 只能拿文字需要特殊清洗逻辑BeautifulSoup 手动灵活可控一句话简单表格直接 pandas复杂表格上 BeautifulSoup。进阶技巧表格里带链接一起抓read_html只能拿到文字拿不到链接。需要连网址一起抓下来比如后续要爬详情页用 BeautifulSoupforrowinrows:cellsrow.find_all(td)link_tagcells[1].find(a)# 第二列是链接movie_namelink_tag.get_text(stripTrue)iflink_tagelsecells[1].get_text(stripTrue)movie_urllink_tag.get(href)iflink_tagelsedata.append([cells[0].get_text(stripTrue),movie_name,movie_url,cells[2].get_text(stripTrue)])真实运行效果两种方法在配套资源包里跑一遍方法一 BeautifulSoup 手动解析表头、5 行数据全部提取转成 DataFrame 并存入 CSV方法二read_html同样一行拿到整个表格进阶的带链接提取也正常。三种玩法全跑通。今天学了什么HTML 表格结构table thead/tbody tr th/td手动解析BeautifulSoup 找 table → 提表头 → 遍历行 → 转 DataFrame一键提取pd.read_html(url)返回表格列表一行搞定选择标准简单用 pandas复杂用 BeautifulSoup编码存 CSVutf-8-sigExcel 打开不乱码完整可跑工程版模拟电影排行榜实战 read_html 带链接进阶提取在配套资源包里。下一篇讲数据批量保存怎么存成 CSV怎么翻页一次抓好几页。梅雅达编程工作室 · Python数据实战系列第3篇简单表格直接 pandas复杂表格上 BeautifulSoup——记住这一句九成场景都不会慌。