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
+119 -119
View File
@@ -6,7 +6,7 @@
"date": "1958-06-08",
"time": "19:00",
"team1": "Argentina",
"team2": "West Germany",
"team2": "Germany",
"score": {
"ft": [
1,
@@ -15,21 +15,21 @@
},
"goals1": [
{
"name": "Corbatta",
"name": "Omar Oreste Corbatta",
"minute": 3
}
],
"goals2": [
{
"name": "Rahn",
"name": "Helmut Rahn",
"minute": 32
},
{
"name": "Rahn",
"name": "Helmut Rahn",
"minute": 79
},
{
"name": "Seeler",
"name": "Uwe Seeler",
"minute": 42
}
],
@@ -50,7 +50,7 @@
},
"goals1": [
{
"name": "Cush",
"name": "Wilbur Cush",
"minute": 21
}
],
@@ -61,7 +61,7 @@
"group": "Group 1",
"date": "1958-06-11",
"time": "19:00",
"team1": "West Germany",
"team1": "Germany",
"team2": "Czechoslovakia",
"score": {
"ft": [
@@ -71,22 +71,22 @@
},
"goals1": [
{
"name": "Schäfer",
"name": "Hans Schäfer",
"minute": 60
},
{
"name": "Rahn",
"name": "Helmut Rahn",
"minute": 71
}
],
"goals2": [
{
"name": "Dvořák",
"name": "Milan Dvořák",
"minute": 24,
"penalty": true
},
{
"name": "Zikán",
"name": "Zdeněk Zikán",
"minute": 42
}
],
@@ -107,22 +107,22 @@
},
"goals1": [
{
"name": "Corbatta",
"name": "Omar Oreste Corbatta",
"minute": 37,
"penalty": true
},
{
"name": "Menéndez",
"name": "Norberto Menéndez",
"minute": 56
},
{
"name": "Avio",
"name": "Ludovico Avio",
"minute": 60
}
],
"goals2": [
{
"name": "McParland",
"name": "Peter McParland",
"minute": 4
}
],
@@ -133,7 +133,7 @@
"group": "Group 1",
"date": "1958-06-15",
"time": "19:00",
"team1": "West Germany",
"team1": "Germany",
"team2": "Northern Ireland",
"score": {
"ft": [
@@ -143,21 +143,21 @@
},
"goals1": [
{
"name": "Rahn",
"name": "Helmut Rahn",
"minute": 20
},
{
"name": "Seeler",
"name": "Uwe Seeler",
"minute": 78
}
],
"goals2": [
{
"name": "McParland",
"name": "Peter McParland",
"minute": 18
},
{
"name": "McParland",
"name": "Peter McParland",
"minute": 60
}
],
@@ -178,33 +178,33 @@
},
"goals1": [
{
"name": "Dvořák",
"name": "Milan Dvořák",
"minute": 8
},
{
"name": "Zikán",
"name": "Zdeněk Zikán",
"minute": 17
},
{
"name": "Zikán",
"name": "Zdeněk Zikán",
"minute": 40
},
{
"name": "Feureisl",
"name": "Jiří Feureisl",
"minute": 69
},
{
"name": "Hovorka",
"name": "Václav Hovorka",
"minute": 82
},
{
"name": "Hovorka",
"name": "Václav Hovorka",
"minute": 89
}
],
"goals2": [
{
"name": "Corbatta",
"name": "Omar Oreste Corbatta",
"minute": 65,
"penalty": true
}
@@ -230,17 +230,17 @@
},
"goals1": [
{
"name": "McParland",
"name": "Peter McParland",
"minute": 44
},
{
"name": "McParland",
"name": "Peter McParland",
"minute": 97
}
],
"goals2": [
{
"name": "Zikán",
"name": "Zdeněk Zikán",
"minute": 18
}
],
@@ -261,46 +261,46 @@
},
"goals1": [
{
"name": "Fontaine",
"name": "Just Fontaine",
"minute": 24
},
{
"name": "Fontaine",
"name": "Just Fontaine",
"minute": 30
},
{
"name": "Fontaine",
"name": "Just Fontaine",
"minute": 67
},
{
"name": "Piantoni",
"name": "Roger Piantoni",
"minute": 52
},
{
"name": "Wisnieski",
"name": "Maryan Wisnieski",
"minute": 61
},
{
"name": "Kopa",
"name": "Raymond Kopa",
"minute": 70
},
{
"name": "Vincent",
"name": "Jean Vincent",
"minute": 83
}
],
"goals2": [
{
"name": "Amarilla",
"name": "Florencio Amarilla",
"minute": 20
},
{
"name": "Amarilla",
"name": "Florencio Amarilla",
"minute": 44,
"penalty": true
},
{
"name": "Romero",
"name": "Jorge Lino Romero",
"minute": 50
}
],
@@ -321,13 +321,13 @@
},
"goals1": [
{
"name": "Petaković",
"name": "Aleksandar Petaković",
"minute": 6
}
],
"goals2": [
{
"name": "Murray",
"name": "Jimmy Murray",
"minute": 49
}
],
@@ -348,25 +348,25 @@
},
"goals1": [
{
"name": "Petaković",
"name": "Aleksandar Petaković",
"minute": 16
},
{
"name": "Veselinović",
"name": "Todor Veselinović",
"minute": 63
},
{
"name": "Veselinović",
"name": "Todor Veselinović",
"minute": 88
}
],
"goals2": [
{
"name": "Fontaine",
"name": "Just Fontaine",
"minute": 4
},
{
"name": "Fontaine",
"name": "Just Fontaine",
"minute": 85
}
],
@@ -387,25 +387,25 @@
},
"goals1": [
{
"name": "Agüero",
"name": "Juan Bautista Agüero",
"minute": 4
},
{
"name": "Ré",
"name": "Cayetano Ré",
"minute": 45
},
{
"name": "Parodi",
"name": "José Parodi",
"minute": 73
}
],
"goals2": [
{
"name": "Mudie",
"name": "Jackie Mudie",
"minute": 24
},
{
"name": "Collins",
"name": "Bobby Collins",
"minute": 74
}
],
@@ -426,17 +426,17 @@
},
"goals1": [
{
"name": "Kopa",
"name": "Raymond Kopa",
"minute": 22
},
{
"name": "Fontaine",
"name": "Just Fontaine",
"minute": 44
}
],
"goals2": [
{
"name": "Baird",
"name": "Sammy Baird",
"minute": 58
}
],
@@ -457,29 +457,29 @@
},
"goals1": [
{
"name": "Parodi",
"name": "José Parodi",
"minute": 20
},
{
"name": "Agüero",
"name": "Juan Bautista Agüero",
"minute": 52
},
{
"name": "Romero",
"name": "Jorge Lino Romero",
"minute": 80
}
],
"goals2": [
{
"name": "Ognjanović",
"name": "Radivoje Ognjanović",
"minute": 18
},
{
"name": "Veselinović",
"name": "Todor Veselinović",
"minute": 21
},
{
"name": "Rajkov",
"name": "Zdravko Rajkov",
"minute": 73
}
],
@@ -500,15 +500,15 @@
},
"goals1": [
{
"name": "Simonsson",
"name": "Agne Simonsson",
"minute": 17
},
{
"name": "Simonsson",
"name": "Agne Simonsson",
"minute": 64
},
{
"name": "Liedholm",
"name": "Nils Liedholm",
"minute": 57,
"penalty": true
}
@@ -530,13 +530,13 @@
},
"goals1": [
{
"name": "Bozsik",
"name": "József Bozsik",
"minute": 5
}
],
"goals2": [
{
"name": "J. Charles",
"name": "John Charles",
"minute": 27
}
],
@@ -557,13 +557,13 @@
},
"goals1": [
{
"name": "Belmonte",
"name": "Jaime Belmonte",
"minute": 89
}
],
"goals2": [
{
"name": "I. Allchurch",
"name": "Ivor Allchurch",
"minute": 32
}
],
@@ -584,17 +584,17 @@
},
"goals1": [
{
"name": "Hamrin",
"name": "Kurt Hamrin",
"minute": 34
},
{
"name": "Hamrin",
"name": "Kurt Hamrin",
"minute": 55
}
],
"goals2": [
{
"name": "Tichy",
"name": "Lajos Tichy",
"minute": 77
}
],
@@ -630,19 +630,19 @@
},
"goals1": [
{
"name": "Tichy",
"name": "Lajos Tichy",
"minute": 19
},
{
"name": "Tichy",
"name": "Lajos Tichy",
"minute": 46
},
{
"name": "Sándor",
"name": "Károly Sándor",
"minute": 54
},
{
"name": "Bencsics",
"name": "József Bencsics",
"minute": 69
}
],
@@ -663,17 +663,17 @@
},
"goals1": [
{
"name": "I. Allchurch",
"name": "Ivor Allchurch",
"minute": 55
},
{
"name": "Medwin",
"name": "Terry Medwin",
"minute": 76
}
],
"goals2": [
{
"name": "Tichy",
"name": "Lajos Tichy",
"minute": 33
}
],
@@ -694,11 +694,11 @@
},
"goals1": [
{
"name": "Altafini",
"name": "José Altafini",
"minute": 37
},
{
"name": "Altafini",
"name": "José Altafini",
"minute": 85
},
{
@@ -723,21 +723,21 @@
},
"goals1": [
{
"name": "Simonyan",
"name": "Nikita Simonyan",
"minute": 13
},
{
"name": "A. Ivanov",
"name": "Aleksandr Ivanov",
"minute": 56
}
],
"goals2": [
{
"name": "Kevan",
"name": "Derek Kevan",
"minute": 66
},
{
"name": "Finney",
"name": "Tom Finney",
"minute": 85,
"penalty": true
}
@@ -774,11 +774,11 @@
},
"goals1": [
{
"name": "Ilyin",
"name": "Anatoli Ilyin",
"minute": 15
},
{
"name": "V. Ivanov",
"name": "Valentin Kozmich Ivanov",
"minute": 62
}
],
@@ -799,21 +799,21 @@
},
"goals1": [
{
"name": "Haynes",
"name": "Johnny Haynes",
"minute": 56
},
{
"name": "Kevan",
"name": "Derek Kevan",
"minute": 74
}
],
"goals2": [
{
"name": "Koller",
"name": "Karl Koller",
"minute": 15
},
{
"name": "Körner",
"name": "Alfred Körner",
"minute": 71
}
],
@@ -859,7 +859,7 @@
},
"goals1": [
{
"name": "Ilyin",
"name": "Anatoli Ilyin",
"minute": 69
}
],
@@ -899,19 +899,19 @@
},
"goals1": [
{
"name": "Wisnieski",
"name": "Maryan Wisnieski",
"minute": 44
},
{
"name": "Fontaine",
"name": "Just Fontaine",
"minute": 55
},
{
"name": "Fontaine",
"name": "Just Fontaine",
"minute": 63
},
{
"name": "Piantoni",
"name": "Roger Piantoni",
"minute": 68
}
],
@@ -931,11 +931,11 @@
},
"goals1": [
{
"name": "Hamrin",
"name": "Kurt Hamrin",
"minute": 49
},
{
"name": "Simonsson",
"name": "Agne Simonsson",
"minute": 88
}
],
@@ -945,7 +945,7 @@
"round": "Quarter-finals",
"date": "1958-06-19",
"time": "19:00",
"team1": "West Germany",
"team1": "Germany",
"team2": "Yugoslavia",
"score": {
"ft": [
@@ -955,7 +955,7 @@
},
"goals1": [
{
"name": "Rahn",
"name": "Helmut Rahn",
"minute": 12
}
],
@@ -997,11 +997,11 @@
],
"goals2": [
{
"name": "Fontaine",
"name": "Just Fontaine",
"minute": 9
},
{
"name": "Piantoni",
"name": "Roger Piantoni",
"minute": 83
}
],
@@ -1012,7 +1012,7 @@
"date": "1958-06-24",
"time": "19:00",
"team1": "Sweden",
"team2": "West Germany",
"team2": "Germany",
"score": {
"ft": [
3,
@@ -1021,21 +1021,21 @@
},
"goals1": [
{
"name": "Skoglund",
"name": "Lennart Skoglund",
"minute": 32
},
{
"name": "Gren",
"name": "Gunnar Gren",
"minute": 81
},
{
"name": "Hamrin",
"name": "Kurt Hamrin",
"minute": 88
}
],
"goals2": [
{
"name": "Schäfer",
"name": "Hans Schäfer",
"minute": 24
}
],
@@ -1046,7 +1046,7 @@
"date": "1958-06-28",
"time": "17:00",
"team1": "France",
"team2": "West Germany",
"team2": "Germany",
"score": {
"ft": [
6,
@@ -1055,42 +1055,42 @@
},
"goals1": [
{
"name": "Fontaine",
"name": "Just Fontaine",
"minute": 16
},
{
"name": "Fontaine",
"name": "Just Fontaine",
"minute": 36
},
{
"name": "Fontaine",
"name": "Just Fontaine",
"minute": 78
},
{
"name": "Fontaine",
"name": "Just Fontaine",
"minute": 89
},
{
"name": "Kopa",
"name": "Raymond Kopa",
"minute": 27,
"penalty": true
},
{
"name": "Douis",
"name": "Yvon Douis",
"minute": 50
}
],
"goals2": [
{
"name": "Cieslarczyk",
"name": "Hans Cieslarczyk",
"minute": 18
},
{
"name": "Rahn",
"name": "Helmut Rahn",
"minute": 52
},
{
"name": "Schäfer",
"name": "Hans Schäfer",
"minute": 84
}
],
@@ -1126,17 +1126,17 @@
"minute": 90
},
{
"name": "Zagallo",
"name": "Mário Zagallo",
"minute": 68
}
],
"goals2": [
{
"name": "Liedholm",
"name": "Nils Liedholm",
"minute": 4
},
{
"name": "Simonsson",
"name": "Agne Simonsson",
"minute": 80
}
],