You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BeautifulSoup4爬取篮球参考网站时仅获取一个表格的问题

问题解决:无法从Basketball Reference获取所有表格

问题原因

Basketball Reference网站的大部分数据表格并不是直接放在DOM结构里的,而是被包裹在HTML注释(<!-- ... -->)中。BeautifulSoup默认只会解析正常的DOM元素,不会去读取注释内部的HTML标签,所以你调用findAll("table")只能拿到页面上直接可见的1个表格;而打印soupMaker时能看到完整HTML,是因为注释内容也被包含在响应文本里。

解决方案

我们需要手动遍历页面中的所有注释节点,将注释内部的HTML内容解析为新的BeautifulSoup对象,再从中提取表格。以下是修改后的代码:

import requests
import bs4
from bs4 import Comment

def get_all_tables(url):
    res = requests.get(url)
    main_soup = bs4.BeautifulSoup(res.text, 'html.parser')
    all_tables = []
    
    # 先收集页面中直接存在的表格
    all_tables.extend(main_soup.find_all("table"))
    
    # 遍历所有注释节点,解析其中的表格
    for comment in main_soup.find_all(string=lambda text: isinstance(text, Comment)):
        # 尝试解析注释内的HTML
        comment_soup = bs4.BeautifulSoup(comment, 'html.parser')
        comment_tables = comment_soup.find_all("table")
        if comment_tables:
            all_tables.extend(comment_tables)
    
    return all_tables

# 调用函数并打印表格数量
atl_tables = get_all_tables("https://www.basketball-reference.com/teams/ATL/2012.html")
print(len(atl_tables))

代码说明

  • 首先获取页面的主BeautifulSoup对象,收集其中直接存在的表格;
  • 使用find_all(string=lambda text: isinstance(text, Comment))筛选出所有注释节点;
  • 对每个注释内容重新解析为BeautifulSoup对象,提取其中的表格并合并到列表中;
  • 最终返回的all_tables列表包含了页面上的所有表格。

Basketball Reference用这种方式存储表格是为了配合前端JS动态渲染,所以爬取时需要额外处理注释内容,这样就能拿到页面上的全部表格了。

内容的提问来源于stack exchange,提问作者f1uk3r

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 03:42:36