-
Notifications
You must be signed in to change notification settings - Fork 0
/
HOFParser.java
115 lines (104 loc) · 3.9 KB
/
HOFParser.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import javax.swing.text.AbstractDocument;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.*;
import java.util.regex.*;
/**
* This class parses data from https://en.hispanosnba.com/players/hall-of-fame/index to create a list
* of all NBA hall of fame players in history. It then parses data from https://www.sports-reference.com/cbb/players/
* to obtain the college stats of those hall of fame players. Then, it averages those stats from each of the
* five categories.
*/
public class HOFParser {
private String baseURL;
private Document currentDoc;
private List<String> players;
public HOFParser(String url) {
baseURL = url;
players = new ArrayList<>();
try {
this.currentDoc = Jsoup.connect(this.baseURL).get();
} catch (IOException e) {
e.printStackTrace();
}
}
//useful helper method for testing
public void showCurrDoc() {
System.out.println(currentDoc);
}
//creates a list of all NBA hall of fame players
public void setPlayers() {
Elements th = currentDoc.select("th.tdl");
for (Element e : th) {
if (e.child(0).text().equals("Nate Archibald")) {
players.add("Tiny Archibald"); //edge case, Nate Archibald is more often called Tiny Archibald
} else {
players.add(e.child(0).text());
}
}
//System.out.println(players);
}
//connects to the page that the last name starts with
public void connectLastNamePage(String lastInitial) {
try {
currentDoc = Jsoup.connect("https://www.sports-reference.com/cbb/players/").get();
} catch (IOException e) {
e.printStackTrace();
}
String lastInitialLink = "";
Elements aTag = currentDoc.select("a");
for (Element e : aTag) {
if (e.text().equals(lastInitial)) {
lastInitialLink = e.attr("abs:href");
}
}
try {
currentDoc = Jsoup.connect(lastInitialLink).get();
} catch (IOException e) {
e.printStackTrace();
}
}
//returns the average across all players of the list of the stat that gets passed in
public double getAverage(String stat) {
double average = 0;
double total = 0;
int count = 0;
String playerLink = "";
for (String player : players) {
String[] firstAndLast = player.split(" ");
String lastInitial = firstAndLast[firstAndLast.length - 1].substring(0, 1);
connectLastNamePage(lastInitial);
Elements aTag = currentDoc.select("a");
for (Element a : aTag) {
if (a.text().equals(player)) {
playerLink = a.attr("abs:href");
break;
}
playerLink = "";
}
if (!playerLink.equals("")) {
try {
currentDoc = Jsoup.connect(playerLink).get();
} catch (IOException e) {
e.printStackTrace();
}
Elements span = currentDoc.select("span.poptip");
for (Element s : span) {
if (s.child(0).text().equals(stat)) {
String pointsToAdd = s.nextElementSibling().nextElementSibling().text();
if (!pointsToAdd.equals("-")) {
total += Double.parseDouble(pointsToAdd);
count++;
}
}
}
}
}
average = total / count;
return average;
}
}