Pandas表格数据被HTML注释包裹时的正确爬取方法
在使用 Pandas 的read_html()提取 HTML 表格时,一个常见陷阱是目标表格被注释标签包裹,导致第二张表格返回空 DataFrame;必须先清除注释后再进行解析。
使用 Pandas 的 read_html() 爬取网页表格时,很容易遇到一个隐藏的坑:目标表格被 HTML 注释符()包裹。从原始 HTML 来看,表格确实存在,但标准 HTML 解析器(如 BeautifulSoup)默认会跳过注释节点,read_html() 内部使用的解析器也是如此。因此,即使通过 soup.find_all() 也无法定位到该表格,直接传入包含注释的字符串也会因结构不可见而导致解析失败——最终返回一个空 DataFrame。
在上面这段代码中,“stats_keeper”这张表实际上隐藏在注释块内部(查看页面源代码即可确认)。soup.find_all('table', {'id': 'stats_keeper'}) 很可能会返回空列表或引发索引错误,而后续 pd.read_html(str(table2)) 传入的字符串仍带有注释语法,解析器无法识别,自然只能返回空表。
那么正确的做法是什么?最佳方案是:避开 BeautifulSoup,直接在原始响应文本上处理,彻底清除所有 HTML 注释标记,再交给 pd.read_html() 统一解析。同时,利用 StringIO 将清理后的字符串包装成类文件对象,可有效避免许多兼容性问题:
from io import StringIO
import pandas as pd
import requests
url = "https://fbref.com/en/comps/9/keepers/Premier-League-Stats"
response = requests.get(url)
# 清理注释:简单替换(适用于无嵌套注释的场景)
cleaned_html = response.text.replace('', '')
# 使用 StringIO 包装,确保 read_html 能正确读取
html_io = StringIO(cleaned_html)
# 一次性解析指定 ID 的表格(更健壮,避免索引错误)
df1 = pd.read_html(html_io, attrs={'id': 'stats_squads_keeper_for'}, fla vor='bs4')[0]
html_io.seek(0) # 重置指针位置
df2 = pd.read_html(html_io, attrs={'id': 'stats_keeper'}, fla vor='bs4')[0]
print("第一张表(球队门将统计)形状:", df1.shape)
print("第二张表(球员门将统计)形状:", df2.shape)
实践中有几个关键点需要特别注意:
replace('', '')是一种轻量级方案,适用于注释不嵌套、结构简单的页面(如 fbref)。如果页面存在多层嵌套注释,建议改用正则表达式re.sub(r'', '', text, flags=re.DOTALL),更加安全可靠。- 每次调用
pd.read_html()之前,务必重置StringIO指针(seek(0)),否则第二次读取会从末尾开始,结果依然为空。 - 显式指定
fla vor='bs4'可提升解析的稳定性,尤其是在环境中同时安装了多个 HTML 解析器的情况下。 - 如果仍出现错误,建议将清理后的
cleaned_html保存到本地,手动检查目标是否存在以及结构是否完整。
总结一下:HTML 注释并非“隐藏”,而是“被解析器主动忽略”。与其在 DOM 树中费力查找,不如前置清洗原始 HTML 文本——这是爬取动态渲染或被注释包裹的表格时,最可靠也最简洁的解决思路。
来源:https://www.php.cn/faq/2746567.html
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
更多
同类文章
如何在Go中安全地创建和使用time.Ticker最佳实践指南
在Go中,time Ticker的创建位置直接影响并发安全。最佳实践是在goroutine外创建或完全限定在单个goroutine内使用,严禁无保护跨goroutine共享。无论采用哪种方式,都必须在使用完毕后调用Stop()释放底层定时器资源,防止goroutine泄露。停止后的Ticker不应再调用Reset以避免竞态。
时间:2026-07-06 06:54
Go跨文件cgo结构体类型不兼容的解决方案
cgo为每个Go包生成独立的C命名空间,导致跨文件使用同一C结构体时类型不兼容。解决方案是在中心包中定义Go封装类型(如typePointC point_t),并将所有构造、访问和业务逻辑封装其中,其他包仅引用Go类型,避免直接暴露C类型。
时间:2026-07-06 06:53
Go语言有符号整数二进制补码的正确输出方法
Go语言fmt Printf的%b格式对负数输出带负号的绝对值二进制,而非底层补码位模式。需注意,通过将相同位宽的有符号整数转换为无符号类型(例如将int8转为uint8),可获取真实的二进制补码比特序列,如-5输出11111011,即其补码。
时间:2026-07-06 06:53
Python列表按出现顺序批量替换重复字符串
Python列表遍历中,使用计数器对重复字符串(如“latest png”)按出现顺序依次替换为带递增编号的新字符串(如“latest1 png”),保持原列表不变。该方法时间复杂度O(n),无需额外库,严格匹配避免误改,不修改原始列表。
时间:2026-07-06 06:53
Go语言中如何正确读取io.Reader避免重复与内存污染
Go开发者使用io Reader Read()手动读取HTTP响应体时,因忽略实际读取字节数n和未正确处理io EOF,导致内容重复、空字节污染等问题。必须使用buf[:n]追加有效数据,将io EOF视为正常终止信号,并检查其他错误,从而避免内存污染与panic风险。
时间:2026-07-06 06:53更多
热门专题
- 日榜
- 周榜
- 月榜
更多
相关攻略
如何在Go中安全地创建和使用time.Ticker最佳实践指南
2026-07-06 06:54
Go跨文件cgo结构体类型不兼容的解决方案
2026-07-06 06:53
Go语言有符号整数二进制补码的正确输出方法
2026-07-06 06:53
Python列表按出现顺序批量替换重复字符串
2026-07-06 06:53
Go语言中如何正确读取io.Reader避免重复与内存污染
2026-07-06 06:53
安全检查并避免Go log15日志器重复添加上下文字段
2026-07-06 06:53
PHP-CS-Fixer禁止多行数组末尾逗号的配置方法与步骤
2026-07-06 06:52
如何在Revel模板中正确传递嵌套结构体切片数据
2026-07-06 06:52
更多
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
梦之形手机版阿鬼角色技能解析与实战表现 发布于 2026-07-06
红色沙漠暗影主宰成就完成攻略 发布于 2026-07-06
Garden-in新滤镜成就解锁攻略 发布于 2026-07-06
王者荣耀世界光追开启位置指南 发布于 2026-07-06
我要当老祖限时首领高伤打法技巧攻略 发布于 2026-07-06
龙腾世纪3审判物品复制方法轻松获取珍稀装备 发布于 2026-07-06
玩转游戏法则,轻松掌握核心技巧与策略 发布于 2026-07-06
龙腾世纪3审判捏脸技巧打造惊艳女性角色 发布于 2026-07-06
Win11频繁断网提示默认网关不可用怎么办 发布于 2026-07-03
Mac如何取消正在进行的系统备份任务 发布于 2026-07-03
电脑显示器刷新率锁死60Hz无法调整的解决方法 发布于 2026-07-03
Linux系统下Systemd服务管理从零开始方法步骤详解完整教程 发布于 2026-07-03
雅迪电动车各型号电量显示图超详细解析 发布于 2026-07-06
内存卡在电脑上显示未格式化的解决方法 发布于 2026-07-06
惠普笔记本重启后如何顺利进入BIOS设置 发布于 2026-07-06
小天鹅洗衣机童锁误开快速关闭教程 发布于 2026-07-06更多
热门话题

