新闻详情

新闻详情

首页 / 资讯中心 / 详情

03_网页表格数据抓取

发布时间:2026/10/1 9:49:59来源:尧图网络
03_网页表格数据抓取
网页里的信息很多但表格是最特殊的一种——它天生就是结构化数据一行一行、一列一列排好了抓下来直接就能用存成 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——记住这一句九成场景都不会慌。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

多语言IM源码:7端互通的协议级语言同步方案 2026/10/1 10:33:24

多语言IM源码:7端互通的协议级语言同步方案

简介:这是一套面向中高级开发者与IM系统学习者的多语言即时通讯源码,聚焦跨平台实时通信核心能力,解决7端互通(含iOS、Android、Web、Windows、macOS、Linux及主流小程序)的架构实现难题。资源包共4个文件,…

阅读更多 →
Java宿舍管理系统源码跑通与改造:JDBC+MySQL实战指南 2026/10/1 10:33:24

Java宿舍管理系统源码跑通与改造:JDBC+MySQL实战指南

简介:这是一套基于Java实现的学生宿舍管理系统项目源码,主要面向高校Java课程设计、数据库实践或毕业设计人群,用来解决宿舍信息录入、查询、统计及日常管理这类常见业务场景。系统使用数据库存储数据,代码内附详细注解&#xff0…

阅读更多 →
廊坊靠谱的GEO优化服务商综合实力推荐 2026/10/1 10:33:24

廊坊靠谱的GEO优化服务商综合实力推荐

唐山佐途信息技术有限公司,简称佐途科技,是一家专注为企业提供AI智能营销与办公提效解决方案的科技服务商。公司以让每一分营销投入都转化为有效商机为核心价值,通过自主研发的讯灵AI-GEOAgent双引擎智能生态系统,帮助生产制造、品…

阅读更多 →
C++ 移动 vs 拷贝:什么时候真的快,什么时候白忙一场 2026/10/1 10:33:24

C++ 移动 vs 拷贝:什么时候真的快,什么时候白忙一场

std::move 这四个字母看起来像一条命令,实际上它连一条指令都不生成 —— 它只是把类型从 T& 改成 T&&,剩下的活全交给重载决议。所以「用了 std::move 就更快」是个错觉:省下来的是资源转移,不是字节复制。这篇不靠计…

阅读更多 →
Python实现SMTP+POP3协议栈:从状态机到可抓包的课设级邮件系统 2026/10/1 10:33:17

Python实现SMTP+POP3协议栈:从状态机到可抓包的课设级邮件系统

简介:这是一份面向计算机网络课程设计与Java Web开发初学者的SMTPPOP3邮件系统模拟项目,聚焦协议原理实践与MVC架构落地。资源完整实现用户注册登录、信息管理、邮件收发与回复等核心功能,采用ServletJSPMyBatisJavaMail技术栈,基…

阅读更多 →
唐山不错的AI搜索优化公司用户力荐 2026/10/1 10:33:17

唐山不错的AI搜索优化公司用户力荐

在唐山,企业数字化转型的浪潮中,有一家深耕行业十二年的技术型服务商——唐山佐途信息技术有限公司,简称佐途科技,始终致力于为企业提供从互联网基础搭建到AI智能获客的全链路解决方案。依托自主研发的讯灵AI-GEOAgent双引擎智能生…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉