使用Jsoup爬取NBA数据时元素无法存入数组的问题求助
核心问题排查
页面动态加载导致静态爬取失效
NBA Stats页面的球队数据是通过AJAX动态加载的,Jsoup的connect(reference).get()只能获取页面的静态骨架HTML,实际的球队数据并不会包含在这部分内容里。你用getElementsByAttributeValue("field", "TEAM_NAME")这类选择器根本找不到对应元素,自然无法提取数据。选择器逻辑不符合页面实际结构
即使页面是静态的,也需要先确认目标元素是否真的带有field="TEAM_NAME"这类属性。可以在代码中添加System.out.println(nba.html()),查看Jsoup实际获取到的页面内容,验证是否存在你要定位的元素。测试代码无法验证数据加载状态
你当前的测试代码System.out.print(NBA.getClass())只会打印ArrayList的类对象信息,无论集合是否有数据,输出都是class java.util.ArrayList,完全无法判断数据是否被正确添加。应改为打印集合内的具体元素:
for(int i=0; i<NBA.size(); i++) { Team team = NBA.get(i); System.out.println(team.getName() + " | 有效命中率: " + team.getShootingScore()); }
解决方案建议
方案1:调用NBA官方数据API(推荐)
NBA Stats提供公开的数据API接口,直接请求接口获取JSON格式数据,比爬取页面更稳定可靠。可以通过浏览器开发者工具的「网络」面板筛选XHR请求,找到加载球队四因素数据的API地址,再用Jsoup或HTTP工具请求该接口,解析JSON并映射到Team对象。
方案2:修正页面爬取逻辑(仅适用于静态数据页面)
若坚持爬取页面,需先定位存放数据的表格,再遍历行提取数据。示例代码如下:
// 根据页面实际结构调整选择器,这里假设数据在id为"stats-table"的表格中 Element table = nba.selectFirst("#stats-table"); if (table != null) { Elements rows = table.select("tr"); // 跳过表头行,从第二行开始遍历 for (int i = 1; i < rows.size(); i++) { Elements cols = rows.get(i).select("td"); if (cols.size() >= 5) { String name = cols.get(0).text(); double shootingScore = Double.parseDouble(cols.get(1).text()); double turnoversScore = Double.parseDouble(cols.get(2).text()); double reboundsScore = Double.parseDouble(cols.get(3).text()); double freethrowsScore = Double.parseDouble(cols.get(4).text()); NBA.add(new Team(name, shootingScore, turnoversScore, reboundsScore, freethrowsScore)); } } }
方案3:完善异常处理
添加NumberFormatException捕获,避免因数据格式问题导致程序崩溃:
try { // ... 数据提取代码 ... } catch (IOException e) { System.out.println("网络请求异常: " + e.getMessage()); } catch (NumberFormatException e) { System.out.println("数据格式转换异常: " + e.getMessage()); }
内容的提问来源于stack exchange,提问作者ReginaldRey

