首页 > 编程语言 >如何正确爬取被HTML注释包裹的Pandas表格数据

如何正确爬取被HTML注释包裹的Pandas表格数据

来源:互联网 2026-07-01 08:10:00

Pandas 的 read_html() 无法解析被 注释标签包裹的 HTML 表格,导致第二张表返回空 DataFrame;需先清除注释再解析。 问题分析:HTML 注释导致 Pandas 解析失败 用 Pandas 的 read_html() 爬取网页表格时,一个常见的坑是目标表格被 HTML

Pandas 的 read_html() 无法解析被 注释标签包裹的 HTML 表格,导致第二张表返回空 DataFrame;需先清除注释再解析。

问题分析:HTML 注释导致 Pandas 解析失败

用 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)) 传入的字符串仍携带注释语法,解析器无法识别,最终返回空表。

长期稳定更新的攒劲资源: >>>点此立即查看<<<

解决方案:前置清理 HTML 注释

正确做法:绕过 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)

注意事项与优化技巧