refactor: consolidate data/ into single root directory, fix historical player names

Merge data/wikipedia/{year}/ into data/{year}/ so there is a single
canonical location for World Cup JSON files. Update scrape and seed
scripts to use data/ instead of data/wikipedia/.

Re-scraped all 22 years (1930-2022) with fixed player name extraction
(full name from <a title="..."> rather than abbreviated display text)
so historical goals now show e.g. "Thomas Müller" not "Müller".

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-15 18:27:35 +02:00
parent 9ce2a4e27c
commit d37ebe201e
48 changed files with 2488 additions and 3630 deletions
+1 -1
View File
@@ -12,7 +12,7 @@
{
"name": "Group 2",
"teams": [
"West Germany",
"Germany",
"Switzerland",
"Argentina",
"Spain"
+78 -78
View File
@@ -14,7 +14,7 @@
},
"goals1": [
{
"name": "Hurst",
"name": "Geoff Hurst",
"minute": 78
}
],
@@ -24,7 +24,7 @@
"round": "Quarter-finals",
"date": "1966-07-23",
"time": "15:00",
"team1": "West Germany",
"team1": "Germany",
"team2": "Uruguay",
"score": {
"ft": [
@@ -34,19 +34,19 @@
},
"goals1": [
{
"name": "Haller",
"name": "Helmut Haller",
"minute": 11
},
{
"name": "Haller",
"name": "Helmut Haller",
"minute": 83
},
{
"name": "Beckenbauer",
"name": "Franz Beckenbauer",
"minute": 70
},
{
"name": "Seeler",
"name": "Uwe Seeler",
"minute": 75
}
],
@@ -66,17 +66,17 @@
},
"goals1": [
{
"name": "Chislenko",
"name": "Igor Chislenko",
"minute": 5
},
{
"name": "Porkuyan",
"name": "Valeriy Porkujan",
"minute": 46
}
],
"goals2": [
{
"name": "Bene",
"name": "Ferenc Bene",
"minute": 57
}
],
@@ -114,7 +114,7 @@
"penalty": true
},
{
"name": "José Augusto",
"name": "José Augusto de Almeida",
"minute": 80
}
],
@@ -138,7 +138,7 @@
"round": "Semi-finals",
"date": "1966-07-25",
"time": "19:30",
"team1": "West Germany",
"team1": "Germany",
"team2": "Soviet Union",
"score": {
"ft": [
@@ -148,17 +148,17 @@
},
"goals1": [
{
"name": "Haller",
"name": "Helmut Haller",
"minute": 43
},
{
"name": "Beckenbauer",
"name": "Franz Beckenbauer",
"minute": 67
}
],
"goals2": [
{
"name": "Porkuyan",
"name": "Valeriy Porkujan",
"minute": 88
}
],
@@ -178,11 +178,11 @@
},
"goals1": [
{
"name": "B. Charlton",
"name": "Bobby Charlton",
"minute": 30
},
{
"name": "B. Charlton",
"name": "Bobby Charlton",
"minute": 80
}
],
@@ -214,13 +214,13 @@
"penalty": true
},
{
"name": "Torres",
"name": "José Augusto Torres",
"minute": 89
}
],
"goals2": [
{
"name": "Malofeyev",
"name": "Eduard Malofeyev",
"minute": 43
}
],
@@ -231,7 +231,7 @@
"date": "1966-07-30",
"time": "15:00",
"team1": "England",
"team2": "West Germany",
"team2": "Germany",
"score": {
"ft": [
2,
@@ -244,29 +244,29 @@
},
"goals1": [
{
"name": "Hurst",
"name": "Geoff Hurst",
"minute": 18
},
{
"name": "Hurst",
"name": "Geoff Hurst",
"minute": 101
},
{
"name": "Hurst",
"name": "Geoff Hurst",
"minute": 120
},
{
"name": "Peters",
"name": "Martin Peters",
"minute": 78
}
],
"goals2": [
{
"name": "Haller",
"name": "Helmut Haller",
"minute": 12
},
{
"name": "Weber",
"name": "Wolfgang Weber",
"minute": 89
}
],
@@ -302,13 +302,13 @@
},
"goals1": [
{
"name": "Hausser",
"name": "Gérard Hausser",
"minute": 62
}
],
"goals2": [
{
"name": "Borja",
"name": "Enrique Borja",
"minute": 48
}
],
@@ -329,17 +329,17 @@
},
"goals1": [
{
"name": "Rocha",
"name": "Pedro Rocha",
"minute": 26
},
{
"name": "Cortés",
"name": "Julio César Cortés",
"minute": 31
}
],
"goals2": [
{
"name": "De Bourgoing",
"name": "Héctor De Bourgoing",
"minute": 15,
"penalty": true
}
@@ -361,11 +361,11 @@
},
"goals1": [
{
"name": "B. Charlton",
"name": "Bobby Charlton",
"minute": 37
},
{
"name": "Hunt",
"name": "Roger Hunt",
"minute": 75
}
],
@@ -401,11 +401,11 @@
},
"goals1": [
{
"name": "Hunt",
"name": "Roger Hunt",
"minute": 38
},
{
"name": "Hunt",
"name": "Roger Hunt",
"minute": 75
}
],
@@ -416,7 +416,7 @@
"group": "Group 2",
"date": "1966-07-12",
"time": "19:30",
"team1": "West Germany",
"team1": "Germany",
"team2": "Switzerland",
"score": {
"ft": [
@@ -426,24 +426,24 @@
},
"goals1": [
{
"name": "Held",
"name": "Sigfried Held",
"minute": 16
},
{
"name": "Haller",
"name": "Helmut Haller",
"minute": 21
},
{
"name": "Haller",
"name": "Helmut Haller",
"minute": 77,
"penalty": true
},
{
"name": "Beckenbauer",
"name": "Franz Beckenbauer",
"minute": 40
},
{
"name": "Beckenbauer",
"name": "Franz Beckenbauer",
"minute": 52
}
],
@@ -464,17 +464,17 @@
},
"goals1": [
{
"name": "Artime",
"name": "Luis Artime",
"minute": 66
},
{
"name": "Artime",
"name": "Luis Artime",
"minute": 79
}
],
"goals2": [
{
"name": "Roma",
"name": "Antonio Roma",
"minute": 72,
"owngoal": true
}
@@ -496,17 +496,17 @@
},
"goals1": [
{
"name": "Sanchís",
"name": "Manuel Sanchís Martínez",
"minute": 57
},
{
"name": "Amancio",
"name": "Amancio Amaro",
"minute": 75
}
],
"goals2": [
{
"name": "Quentin",
"name": "René-Pierre Quentin",
"minute": 31
}
],
@@ -518,7 +518,7 @@
"date": "1966-07-16",
"time": "15:00",
"team1": "Argentina",
"team2": "West Germany",
"team2": "Germany",
"score": {
"ft": [
0,
@@ -542,11 +542,11 @@
},
"goals1": [
{
"name": "Artime",
"name": "Luis Artime",
"minute": 52
},
{
"name": "Onega",
"name": "Ermindo Onega",
"minute": 79
}
],
@@ -557,7 +557,7 @@
"group": "Group 2",
"date": "1966-07-20",
"time": "19:30",
"team1": "West Germany",
"team1": "Germany",
"team2": "Spain",
"score": {
"ft": [
@@ -567,17 +567,17 @@
},
"goals1": [
{
"name": "Emmerich",
"name": "Lothar Emmerich",
"minute": 39
},
{
"name": "Seeler",
"name": "Uwe Seeler",
"minute": 84
}
],
"goals2": [
{
"name": "Fusté",
"name": "Josep Maria Fusté",
"minute": 23
}
],
@@ -623,21 +623,21 @@
},
"goals1": [
{
"name": "José Augusto",
"name": "José Augusto de Almeida",
"minute": 2
},
{
"name": "José Augusto",
"name": "José Augusto de Almeida",
"minute": 67
},
{
"name": "Torres",
"name": "José Augusto Torres",
"minute": 90
}
],
"goals2": [
{
"name": "Bene",
"name": "Ferenc Bene",
"minute": 60
}
],
@@ -658,15 +658,15 @@
},
"goals1": [
{
"name": "Bene",
"name": "Ferenc Bene",
"minute": 2
},
{
"name": "Farkas",
"name": "János Farkas",
"minute": 64
},
{
"name": "Mészöly",
"name": "Kálmán Mészöly",
"minute": 73,
"penalty": true
}
@@ -694,7 +694,7 @@
},
"goals1": [
{
"name": "Vutsov",
"name": "Ivan Vutsov",
"minute": 7,
"owngoal": true
},
@@ -703,7 +703,7 @@
"minute": 38
},
{
"name": "Torres",
"name": "José Augusto Torres",
"minute": 81
}
],
@@ -724,7 +724,7 @@
},
"goals1": [
{
"name": "Simões",
"name": "António Simões",
"minute": 15
},
{
@@ -738,7 +738,7 @@
],
"goals2": [
{
"name": "Rildo",
"name": "Rildo da Costa Menezes",
"minute": 73
}
],
@@ -759,22 +759,22 @@
},
"goals1": [
{
"name": "Davidov",
"name": "Ivan Davidov",
"minute": 43,
"owngoal": true
},
{
"name": "Mészöly",
"name": "Kálmán Mészöly",
"minute": 45
},
{
"name": "Bene",
"name": "Ferenc Bene",
"minute": 54
}
],
"goals2": [
{
"name": "Asparuhov",
"name": "Georgi Asparuhov",
"minute": 15
}
],
@@ -795,15 +795,15 @@
},
"goals1": [
{
"name": "Malofeyev",
"name": "Eduard Malofeyev",
"minute": 31
},
{
"name": "Malofeyev",
"name": "Eduard Malofeyev",
"minute": 88
},
{
"name": "Banishevskiy",
"name": "Anatoliy Banishevskiy",
"minute": 33
}
],
@@ -824,11 +824,11 @@
},
"goals1": [
{
"name": "Mazzola",
"name": "Sandro Mazzola",
"minute": 8
},
{
"name": "Barison",
"name": "Paolo Barison",
"minute": 88
}
],
@@ -849,7 +849,7 @@
},
"goals1": [
{
"name": "Marcos",
"name": "Rubén Marcos",
"minute": 26,
"penalty": true
}
@@ -877,7 +877,7 @@
},
"goals1": [
{
"name": "Chislenko",
"name": "Igor Chislenko",
"minute": 57
}
],
@@ -919,17 +919,17 @@
},
"goals1": [
{
"name": "Porkuyan",
"name": "Valeriy Porkujan",
"minute": 28
},
{
"name": "Porkuyan",
"name": "Valeriy Porkujan",
"minute": 85
}
],
"goals2": [
{
"name": "Marcos",
"name": "Rubén Marcos",
"minute": 32
}
],
+1 -1
View File
@@ -2,7 +2,7 @@
"host": "England",
"teams_count": 16,
"winner": "England",
"runner_up": "West Germany",
"runner_up": "Germany",
"third_place": "Portugal",
"fourth_place": "Soviet Union"
}