Pandas 的 read_html() 无法解析被 注释标签包裹的 HTML 表格,导致第二张表返回空 DataFrame;需先清除注释再解析。 问题分析:HTML 注释导致 Pandas 解析失败 用 Pandas 的 read_html() 爬取网页表格时,一个常见的坑是目标表格被 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 文本——这是爬取动态渲染或注释包裹表格时,最可靠也最简洁的处理方式。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述
相关攻略
更多
同类更新
更多
热游推荐
更多
-
- DreamStudio
- Android/ | AI绘图
- 2026-06-30
下载
-
-
- Playground AI
- Android/ | AI绘图
- 2026-06-30
下载
-
- Adobe Firefly
- Android/ | AI绘图
- 2026-06-30
下载
-
-
-
- Leonardo AI
- Android/ | AI绘图
- 2026-06-30
下载
-
- Stable Diffusion
- Android/ | AI绘图
- 2026-06-30
下载