使用BeautifulSoup爬取FBref表格时无法识别指定id的table元素,返回结果为0
定位匹配结果为0的核心原因
- 裸请求被反爬拦截:不带浏览器标识的默认requests请求,会被FBref的防护机制返回无业务内容的拦截页面,自然无法匹配到目标表格元素。
- 目标表格存储形式特殊:你尝试定位的
id="stats_standard"标准球员统计表格,没有放置在页面可直接遍历的顶层DOM中,而是被包裹在HTML注释节点(<!-- -->)内部,常规的find_all扫描无法触达这类注释内嵌的内容。
可落地的修复方案
- 为请求配置合规的浏览器请求头,绕过基础反爬校验,获取真实的页面HTML
- 遍历页面内所有HTML注释节点,提取注释中包裹的HTML片段
- 在提取的注释片段中解析定位目标表格
修正后的可运行代码
# 导入必要依赖 from bs4 import BeautifulSoup, Comment import requests import pandas as pd # 配置模拟真实浏览器的请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } url = "https://fbref.com/en/comps/9/stats/Premier-League-Stats" # 发送带请求头的GET请求获取页面内容 html_content = requests.get(url, headers=headers).text soup = BeautifulSoup(html_content, "lxml") # 提取页面内所有HTML注释节点 all_comments = soup.find_all(string=lambda text: isinstance(text, Comment)) target_table = None for comment in all_comments: comment_soup = BeautifulSoup(comment, "lxml") # 匹配指定id的目标表格 table = comment_soup.find("table", attrs={"id": "stats_standard"}) if table: target_table = table break print("Number of tables on site: ", 1 if target_table else 0)
提示:FBref对所有大尺寸联赛统计表格统一采用注释包裹的前端实现逻辑,这是网站的专属开发方案,不是你使用的class、id定位语法存在错误。
内容的提问来源于stack exchange,提问作者Shay
相关产品推荐
相关产品推荐

