使用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
相关产品推荐
相关产品推荐

