webget-football 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Manifest.txt +20 -0
- data/Rakefile +1 -0
- data/lib/webget-football.rb +8 -0
- data/lib/webget-football/apis.rb +1 -0
- data/lib/webget-football/apis/download.rb +22 -2
- data/lib/webget-football/apis/leagues.rb +51 -0
- data/lib/webget-football/fbref.rb +7 -0
- data/lib/webget-football/fbref/config.rb +14 -0
- data/lib/webget-football/fbref/download.rb +41 -0
- data/lib/webget-football/fbref/leagues.rb +47 -0
- data/lib/webget-football/fbref/page.rb +32 -0
- data/lib/webget-football/fbref/page_schedule.rb +322 -0
- data/lib/webget-football/metal.rb +19 -0
- data/lib/webget-football/version.rb +1 -1
- data/lib/webget-football/worldfootball.rb +1 -0
- data/lib/webget-football/worldfootball/download.rb +61 -28
- data/lib/webget-football/worldfootball/leagues.rb +200 -0
- data/lib/webget-football/worldfootball/leagues/asia.rb +53 -0
- data/lib/webget-football/worldfootball/leagues/europe--british_isles.rb +59 -0
- data/lib/webget-football/worldfootball/leagues/europe--central.rb +127 -0
- data/lib/webget-football/worldfootball/leagues/europe--eastern.rb +82 -0
- data/lib/webget-football/worldfootball/leagues/europe--northern.rb +57 -0
- data/lib/webget-football/worldfootball/leagues/europe--southern.rb +86 -0
- data/lib/webget-football/worldfootball/leagues/europe--western.rb +38 -0
- data/lib/webget-football/worldfootball/leagues/europe.rb +13 -0
- data/lib/webget-football/worldfootball/leagues/north_america.rb +44 -0
- data/lib/webget-football/worldfootball/leagues/pacific.rb +21 -0
- data/lib/webget-football/worldfootball/leagues/south_america.rb +11 -0
- data/lib/webget-football/worldfootball/page_report.rb +1 -1
- data/lib/webget-football/worldfootball/page_schedule.rb +1 -1
- metadata +36 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 697087826fff9e6bcf453cc39b306f0417a14a8b
|
4
|
+
data.tar.gz: fd2b4ccbf17a04ce25be90ca09abbe5301f2b862
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f3a15071cbadfca2711be5014d9a74d619cf61307791268ad667fd70269d2a7d947f26523f42af9b2b6773a038fecd4e049d5dcc56d50b14ac6db57fbf90229
|
7
|
+
data.tar.gz: 6ab3f694ae27784402cc5cf17ecb8a7fee8961248c92a8659be4caf018d250770921af635de2cc1be2aa16cbeb4d1d8c808b53276a25f0397fc0be9f3cc4c1a4
|
data/Manifest.txt
CHANGED
@@ -6,10 +6,30 @@ lib/webget-football.rb
|
|
6
6
|
lib/webget-football/apis.rb
|
7
7
|
lib/webget-football/apis/config.rb
|
8
8
|
lib/webget-football/apis/download.rb
|
9
|
+
lib/webget-football/apis/leagues.rb
|
10
|
+
lib/webget-football/fbref.rb
|
11
|
+
lib/webget-football/fbref/config.rb
|
12
|
+
lib/webget-football/fbref/download.rb
|
13
|
+
lib/webget-football/fbref/leagues.rb
|
14
|
+
lib/webget-football/fbref/page.rb
|
15
|
+
lib/webget-football/fbref/page_schedule.rb
|
16
|
+
lib/webget-football/metal.rb
|
9
17
|
lib/webget-football/version.rb
|
10
18
|
lib/webget-football/worldfootball.rb
|
11
19
|
lib/webget-football/worldfootball/config.rb
|
12
20
|
lib/webget-football/worldfootball/download.rb
|
21
|
+
lib/webget-football/worldfootball/leagues.rb
|
22
|
+
lib/webget-football/worldfootball/leagues/asia.rb
|
23
|
+
lib/webget-football/worldfootball/leagues/europe--british_isles.rb
|
24
|
+
lib/webget-football/worldfootball/leagues/europe--central.rb
|
25
|
+
lib/webget-football/worldfootball/leagues/europe--eastern.rb
|
26
|
+
lib/webget-football/worldfootball/leagues/europe--northern.rb
|
27
|
+
lib/webget-football/worldfootball/leagues/europe--southern.rb
|
28
|
+
lib/webget-football/worldfootball/leagues/europe--western.rb
|
29
|
+
lib/webget-football/worldfootball/leagues/europe.rb
|
30
|
+
lib/webget-football/worldfootball/leagues/north_america.rb
|
31
|
+
lib/webget-football/worldfootball/leagues/pacific.rb
|
32
|
+
lib/webget-football/worldfootball/leagues/south_america.rb
|
13
33
|
lib/webget-football/worldfootball/page.rb
|
14
34
|
lib/webget-football/worldfootball/page_report.rb
|
15
35
|
lib/webget-football/worldfootball/page_schedule.rb
|
data/Rakefile
CHANGED
data/lib/webget-football.rb
CHANGED
@@ -5,12 +5,20 @@ require 'webget' ## incl. webget, webcache, webclient, etc.
|
|
5
5
|
require 'nokogiri'
|
6
6
|
|
7
7
|
|
8
|
+
require 'sportdb/structs' ## add season support - todo/fix: move to season-formats??
|
9
|
+
|
10
|
+
|
8
11
|
###
|
9
12
|
# our own code
|
10
13
|
require 'webget-football/version' # let version always go first
|
11
14
|
|
15
|
+
## shared base code (e.g. Metal::Base, Page::Base, etc.)
|
16
|
+
require 'webget-football/metal'
|
17
|
+
|
18
|
+
## sources
|
12
19
|
require 'webget-football/apis'
|
13
20
|
require 'webget-football/worldfootball'
|
21
|
+
require 'webget-football/fbref'
|
14
22
|
|
15
23
|
|
16
24
|
puts Webget::Module::Football.banner # say hello
|
data/lib/webget-football/apis.rb
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
module Footballdata
|
2
2
|
|
3
|
+
|
4
|
+
#################
|
5
|
+
## porcelain "api"
|
6
|
+
def self.schedule( league:, season: )
|
7
|
+
season = Season( season ) ## cast (ensure) season class (NOT string, integer, etc.)
|
8
|
+
|
9
|
+
league_code = LEAGUES[ league.downcase ]
|
10
|
+
|
11
|
+
Metal.teams( league_code, season.start_year )
|
12
|
+
Metal.matches( league_code, season.start_year )
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
##################
|
18
|
+
## plumbing metal "helpers"
|
19
|
+
|
3
20
|
## todo/check: put in Downloader namespace/class - why? why not?
|
4
21
|
## or use Metal - no "porcelain" downloaders / machinery
|
5
22
|
class Metal
|
@@ -26,11 +43,14 @@ class Metal
|
|
26
43
|
get( competions_url( 'TIER_THREE' ))
|
27
44
|
end
|
28
45
|
|
29
|
-
|
30
|
-
|
46
|
+
|
47
|
+
def self.teams( code, year )
|
31
48
|
get( competition_teams_url( code, year ))
|
32
49
|
end
|
33
50
|
|
51
|
+
def self.matches( code, year )
|
52
|
+
get( competition_matches_url( code, year ))
|
53
|
+
end
|
34
54
|
|
35
55
|
=begin
|
36
56
|
def self.matches
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Footballdata
|
2
|
+
|
3
|
+
LEAGUES = {
|
4
|
+
'eng.1' => 'PL', # incl. team(s) from wales
|
5
|
+
'eng.2' => 'ELC',
|
6
|
+
# PL - Premier League , England 27 seasons | 2019-08-09 - 2020-07-25 / matchday 31
|
7
|
+
# ELC - Championship , England 3 seasons | 2019-08-02 - 2020-07-22 / matchday 38
|
8
|
+
#
|
9
|
+
# 2019 => 2019/20
|
10
|
+
# 2018 => 2018/19
|
11
|
+
# 2017 => xxx 2017-18 - requires subscription !!!
|
12
|
+
|
13
|
+
'es.1' => 'PD',
|
14
|
+
# PD - Primera Division , Spain 27 seasons | 2019-08-16 - 2020-07-19 / matchday 31
|
15
|
+
|
16
|
+
'pt.1' => 'PPL',
|
17
|
+
# PPL - Primeira Liga , Portugal 9 seasons | 2019-08-10 - 2020-07-26 / matchday 28
|
18
|
+
|
19
|
+
'de.1' => 'BL1',
|
20
|
+
# BL1 - Bundesliga , Germany 24 seasons | 2019-08-16 - 2020-06-27 / matchday 34
|
21
|
+
|
22
|
+
'nl.1' => 'DED',
|
23
|
+
# DED - Eredivisie , Netherlands 10 seasons | 2019-08-09 - 2020-03-08 / matchday 34
|
24
|
+
|
25
|
+
'fr.1' => 'FL1', # incl. team(s) monaco
|
26
|
+
# FL1 - Ligue 1, France
|
27
|
+
# 9 seasons | 2019-08-09 - 2020-05-31 / matchday 38
|
28
|
+
#
|
29
|
+
# 2019 => 2019/20
|
30
|
+
# 2018 => 2018/19
|
31
|
+
# 2017 => xxx 2017-18 - requires subscription !!!
|
32
|
+
|
33
|
+
'it.1' => 'SA',
|
34
|
+
# SA - Serie A , Italy 15 seasons | 2019-08-24 - 2020-08-02 / matchday 27
|
35
|
+
|
36
|
+
'br.1' => 'BSA',
|
37
|
+
# BSA - Série A, Brazil
|
38
|
+
# 4 seasons | 2020-05-03 - 2020-12-06 / matchday 10
|
39
|
+
#
|
40
|
+
# 2020 => 2020
|
41
|
+
# 2019 => 2019
|
42
|
+
# 2018 => 2018
|
43
|
+
# 2017 => xxx 2017 - requires subscription !!!
|
44
|
+
|
45
|
+
## todo/check: use champs and NOT cl - why? why not?
|
46
|
+
'cl' => 'CL', ## note: cl is country code for chile!! - use champs - why? why not?
|
47
|
+
'europe.cl' => 'CL', ## note: cl is country code for chile!! - use champs - why? why not?
|
48
|
+
# CL - UEFA Champions League , Europe 19 seasons | 2019-06-25 - 2020-05-30 / matchday 6
|
49
|
+
}
|
50
|
+
end # module Footballdata
|
51
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
|
2
|
+
module Fbref
|
3
|
+
class Configuration
|
4
|
+
# nothing here for now
|
5
|
+
end # class Configuration
|
6
|
+
|
7
|
+
## lets you use
|
8
|
+
## Fbref.configure do |config|
|
9
|
+
## config.convert.out_dir = './o'
|
10
|
+
## end
|
11
|
+
|
12
|
+
def self.configure() yield( config ); end
|
13
|
+
def self.config() @config ||= Configuration.new; end
|
14
|
+
end # module Fbref
|
@@ -0,0 +1,41 @@
|
|
1
|
+
|
2
|
+
module Fbref
|
3
|
+
|
4
|
+
#################
|
5
|
+
## porcelain "api"
|
6
|
+
def self.schedule( league:, season: )
|
7
|
+
url = Metal.schedule_url( league: league, season: season )
|
8
|
+
Metal.download_page( url )
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
##################
|
15
|
+
## plumbing metal "helpers"
|
16
|
+
class Metal < ::Metal::Base
|
17
|
+
|
18
|
+
BASE_URL = 'https://fbref.com/en'
|
19
|
+
|
20
|
+
|
21
|
+
def self.schedule_url( league:, season: )
|
22
|
+
season = Season( season )
|
23
|
+
|
24
|
+
pages = LEAGUES[ league ]
|
25
|
+
if pages.nil?
|
26
|
+
puts "!! ERROR - no pages (urls) configured for league >#{league}<"
|
27
|
+
exit 1
|
28
|
+
end
|
29
|
+
page = pages[ season.key ]
|
30
|
+
if pages.nil?
|
31
|
+
puts "!! ERROR - no page (url) configured for season >#{season}< for league >#{league}<; available seasons include:"
|
32
|
+
pp pages
|
33
|
+
exit 1
|
34
|
+
end
|
35
|
+
|
36
|
+
"#{BASE_URL}/#{page}"
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
end # module Metal
|
41
|
+
end # module Fbref
|
@@ -0,0 +1,47 @@
|
|
1
|
+
|
2
|
+
module Fbref
|
3
|
+
LEAGUES = {
|
4
|
+
## todo/check: shorten - (auto-)add to base_url - comps/ - why? why not?
|
5
|
+
'at.1' => {
|
6
|
+
'2020/21' => 'comps/56/schedule/Austrian-Bundesliga-Scores-and-Fixtures',
|
7
|
+
'2019/20' => 'comps/56/3213/schedule/2019-2020-Austrian-Bundesliga-Scores-and-Fixtures',
|
8
|
+
'2018/19' => 'comps/56/2352/schedule/2018-2019-Austrian-Bundesliga-Scores-and-Fixtures',
|
9
|
+
},
|
10
|
+
|
11
|
+
'de.1' => {
|
12
|
+
'2020/21' => 'comps/20/schedule/Bundesliga-Scores-and-Fixtures',
|
13
|
+
},
|
14
|
+
|
15
|
+
'eng.1' => {
|
16
|
+
'2020/21' => 'comps/9/schedule/Premier-League-Scores-and-Fixtures',
|
17
|
+
},
|
18
|
+
|
19
|
+
'es.1' => {
|
20
|
+
'2020/21' => 'comps/12/schedule/La-Liga-Scores-and-Fixtures',
|
21
|
+
},
|
22
|
+
|
23
|
+
'it.1' => {
|
24
|
+
'2020/21' => 'comps/11/schedule/Serie-A-Scores-and-Fixtures',
|
25
|
+
},
|
26
|
+
|
27
|
+
'fr.1' => {
|
28
|
+
'2020/21' => 'comps/13/schedule/Ligue-1-Scores-and-Fixtures',
|
29
|
+
},
|
30
|
+
|
31
|
+
'mx.1' => {
|
32
|
+
'2020/21' => 'comps/31/schedule/Liga-MX-Scores-and-Fixtures',
|
33
|
+
'2019/20' => 'comps/31/3267/schedule/2019-2020-Liga-MX-Scores-and-Fixtures',
|
34
|
+
'2018/19' => 'comps/31/2252/schedule/2018-2019-Liga-MX-Scores-and-Fixtures',
|
35
|
+
},
|
36
|
+
|
37
|
+
'br.1' => {
|
38
|
+
'2020' => 'comps/24/schedule/Serie-A-Scores-and-Fixtures',
|
39
|
+
},
|
40
|
+
|
41
|
+
'jp.1' => {
|
42
|
+
'2020' => 'comps/25/schedule/J1-League-Scores-and-Fixtures',
|
43
|
+
'2019' => 'comps/25/3923/schedule/2019-J1-League-Scores-and-Fixtures',
|
44
|
+
'2018' => 'comps/25/1761/schedule/2018-J1-League-Scores-and-Fixtures',
|
45
|
+
},
|
46
|
+
}
|
47
|
+
end # module Fbref
|
@@ -0,0 +1,32 @@
|
|
1
|
+
|
2
|
+
module Fbref
|
3
|
+
|
4
|
+
class Page
|
5
|
+
def self.from_cache( url )
|
6
|
+
html = Webcache.read( url )
|
7
|
+
new( html )
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.from_file( path )
|
11
|
+
html = File.open( path, 'r:utf-8' ) {|f| f.read }
|
12
|
+
new( html )
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
def initialize( html )
|
17
|
+
@html = html
|
18
|
+
end
|
19
|
+
|
20
|
+
def doc
|
21
|
+
## note: if we use a fragment and NOT a document - no access to page head (and meta elements and such)
|
22
|
+
@doc ||= Nokogiri::HTML( @html )
|
23
|
+
end
|
24
|
+
|
25
|
+
def title
|
26
|
+
# <title>Bundesliga 2010/2011 » Spielplan</title>
|
27
|
+
@title ||= doc.css( 'title' ).first
|
28
|
+
@title.text ## get element's text content
|
29
|
+
end
|
30
|
+
end # class Page
|
31
|
+
end # module Fbref
|
32
|
+
|
@@ -0,0 +1,322 @@
|
|
1
|
+
|
2
|
+
module Fbref
|
3
|
+
|
4
|
+
class Page
|
5
|
+
class Schedule < Page ## note: use nested class for now - why? why not?
|
6
|
+
|
7
|
+
def self.from_cache( league:, season: )
|
8
|
+
url = Metal.schedule_url( league: league, season: season )
|
9
|
+
|
10
|
+
## use - super.from_cache( url ) - why? why not?
|
11
|
+
html = Webcache.read( url )
|
12
|
+
new( html )
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
SCHED_KS_ID_RE = %r{(sched_ks_[a-z0-9_]+)}
|
17
|
+
|
18
|
+
def stages
|
19
|
+
|
20
|
+
stages = []
|
21
|
+
buttons = doc.css( 'div#all_sched_ks_all div.section_heading div.sub_section_heading button' )
|
22
|
+
puts "#{buttons.size} button(s):"
|
23
|
+
## pp buttons
|
24
|
+
|
25
|
+
buttons.each do |button|
|
26
|
+
name = button.text
|
27
|
+
table_id = ''
|
28
|
+
if button['onclick'].to_s =~ SCHED_KS_ID_RE
|
29
|
+
table_id = $1
|
30
|
+
else
|
31
|
+
puts "!! ERROR - no table id found"
|
32
|
+
exit 1
|
33
|
+
end
|
34
|
+
|
35
|
+
if table_id == 'sched_ks_all' ## skip all-in-one
|
36
|
+
else
|
37
|
+
stages << { name: name,
|
38
|
+
table_id: table_id }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
=begin
|
43
|
+
<div class="section_heading">
|
44
|
+
<span class="section_anchor" id="sched_ks_all_link" data-label="Scores & Fixtures" data-no-inpage="1"></span><h2>Scores & Fixtures <span style="color: #777; font-size:smaller">2019-2020 Austrian Bundesliga</span></h2> <div class="section_heading_text">
|
45
|
+
<ul><li><span class="shim"></span></li>
|
46
|
+
</ul>
|
47
|
+
</div>
|
48
|
+
<div class="sub_section_heading">
|
49
|
+
<button onclick="setTimeout(function(){sr_st_construct_stats_table_features('sched_ks_all'); }, 100);" data-hide="[id^=all_sched_ks]" data-show="#all_sched_ks_all">All Rounds</button>
|
50
|
+
<button onclick="setTimeout(function(){sr_st_construct_stats_table_features('sched_ks_3213_1'); }, 100);" data-hide="[id^=all_sched_ks]" data-show="#all_sched_ks_3213_1">Regular Season</button>
|
51
|
+
<button onclick="setTimeout(function(){sr_st_construct_stats_table_features('sched_ks_3213_2'); }, 100);" data-hide="[id^=all_sched_ks]" data-show="#all_sched_ks_3213_2">Championship round</button>
|
52
|
+
<button onclick="setTimeout(function(){sr_st_construct_stats_table_features('sched_ks_3213_3'); }, 100);" data-hide="[id^=all_sched_ks]" data-show="#all_sched_ks_3213_3">Relegation round</button>
|
53
|
+
<button onclick="setTimeout(function(){sr_st_construct_stats_table_features('sched_ks_3213_4'); }, 100);" data-hide="[id^=all_sched_ks]" data-show="#all_sched_ks_3213_4">Europa League play-offs</button>
|
54
|
+
</div>
|
55
|
+
=end
|
56
|
+
stages
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
def matches
|
62
|
+
tables = @doc.css( 'table.stats_table' )
|
63
|
+
|
64
|
+
puts " found #{tables.size} table(s):"
|
65
|
+
tables.each do |table|
|
66
|
+
puts " table >#{table['id']}<" ## add no of rows too?
|
67
|
+
end
|
68
|
+
|
69
|
+
rows = []
|
70
|
+
if tables.size == 2
|
71
|
+
## note: if tables size == 2 assume all table and "regular" season table, thus, is the same (missing table for more stages!!!)
|
72
|
+
rows += match_rows( tables[1] )
|
73
|
+
## todo/fix: issue a warning about missing table!!!!
|
74
|
+
puts "!! WARN: missing stage table(s):"
|
75
|
+
pp stages
|
76
|
+
elsif tables.size > 1
|
77
|
+
stages.each do |stage|
|
78
|
+
name = stage[:name]
|
79
|
+
table_id = stage[:table_id]
|
80
|
+
|
81
|
+
table = tables.find {|table| table['id'] == table_id }
|
82
|
+
if table
|
83
|
+
puts " adding stage >#{name}<..."
|
84
|
+
rows += match_rows( table, stage: name )
|
85
|
+
else
|
86
|
+
puts "!! ERROR: table with id >< for stage >< not found; mismatch sorry"
|
87
|
+
exit 1
|
88
|
+
end
|
89
|
+
end
|
90
|
+
else
|
91
|
+
## assume single-table
|
92
|
+
rows += match_rows( tables[0] )
|
93
|
+
end
|
94
|
+
|
95
|
+
puts " found #{tables.size} table(s):"
|
96
|
+
tables.each do |table|
|
97
|
+
puts " table >#{table['id']}<" ## add no of rows too?
|
98
|
+
end
|
99
|
+
|
100
|
+
rows
|
101
|
+
end
|
102
|
+
|
103
|
+
|
104
|
+
=begin
|
105
|
+
def matches_all
|
106
|
+
rows = []
|
107
|
+
|
108
|
+
table = @doc.css( 'table#sched_ks_all' ).first
|
109
|
+
|
110
|
+
ths = table.css( 'thead tr th')
|
111
|
+
|
112
|
+
puts " #{ths.size} column heading(s):"
|
113
|
+
ths.each_with_index do |th,i|
|
114
|
+
puts "#{i+1}: >#{th.text}< - #{th.attr('data-stat')}"
|
115
|
+
end
|
116
|
+
|
117
|
+
rows += match_rows( table )
|
118
|
+
rows
|
119
|
+
end
|
120
|
+
=end
|
121
|
+
|
122
|
+
|
123
|
+
#######
|
124
|
+
# helpers
|
125
|
+
|
126
|
+
COLUMN_RENAMES = {
|
127
|
+
'gameweek' => 'matchweek',
|
128
|
+
'squad_a' => 'team1',
|
129
|
+
'squad_b' => 'team2',
|
130
|
+
'notes' => 'comments',
|
131
|
+
}
|
132
|
+
|
133
|
+
|
134
|
+
def match_rows( table, **fixed_columns )
|
135
|
+
rows = []
|
136
|
+
|
137
|
+
trs = table.css( 'tbody tr')
|
138
|
+
puts " #{trs.size} row(s):"
|
139
|
+
|
140
|
+
trs.each_with_index do |tr,i|
|
141
|
+
print "#{i+1}: "
|
142
|
+
|
143
|
+
if tr.attr('class').to_s.index( 'spacer')
|
144
|
+
print "---"
|
145
|
+
else
|
146
|
+
row = {}
|
147
|
+
row = row.merge( fixed_columns )
|
148
|
+
|
149
|
+
tds = tr.css( 'th,td' )
|
150
|
+
tds.each do |td|
|
151
|
+
key = td.attr('data-stat')
|
152
|
+
value = td.text.strip
|
153
|
+
|
154
|
+
print "#{key}: >#{value}< | "
|
155
|
+
|
156
|
+
## note: skip expected goal (xg) for now
|
157
|
+
next if ['xg_a', 'xg_b'].include?( key )
|
158
|
+
|
159
|
+
### note: rename some column keys!!
|
160
|
+
key = COLUMN_RENAMES[ key ] if COLUMN_RENAMES[ key ]
|
161
|
+
|
162
|
+
|
163
|
+
if key == 'score'
|
164
|
+
value = value.gsub( '–', '-' ) ## translate fancy dash (\u2013)
|
165
|
+
end
|
166
|
+
|
167
|
+
if key == 'attendance'
|
168
|
+
## remove thousand seperator e.g.
|
169
|
+
## 24,200 => 24200 etc.
|
170
|
+
## 1,900 => 1900
|
171
|
+
value = value.gsub( ',', '' )
|
172
|
+
end
|
173
|
+
|
174
|
+
if key == 'match_report'
|
175
|
+
## get href from embedded anchor link (<a href="">)
|
176
|
+
links = td.css('a')
|
177
|
+
value = if links.size > 0
|
178
|
+
links[0]['href']
|
179
|
+
else
|
180
|
+
'' # no (linked) match report found
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
## note: use ALwAYS symbols for now - why? why not?
|
185
|
+
row[ key.to_sym ] = value
|
186
|
+
end
|
187
|
+
rows << row
|
188
|
+
end
|
189
|
+
print "\n\n"
|
190
|
+
end
|
191
|
+
|
192
|
+
rows
|
193
|
+
end
|
194
|
+
|
195
|
+
end # class Schedule
|
196
|
+
end # class Page
|
197
|
+
end # module Fbref
|
198
|
+
|
199
|
+
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
=begin
|
204
|
+
# <table class="min_width sortable stats_table min_width" id="sched_ks_all"
|
205
|
+
|
206
|
+
13 column heading(s):
|
207
|
+
1: >Round< - round
|
208
|
+
2: >Wk< - gameweek
|
209
|
+
3: >Day< - dayofweek
|
210
|
+
4: >Date< - date
|
211
|
+
5: >Time< - time
|
212
|
+
6: >Home< - squad_a
|
213
|
+
7: >Score< - score
|
214
|
+
8: >Away< - squad_b
|
215
|
+
9: >Attendance< - attendance
|
216
|
+
10: >Venue< - venue
|
217
|
+
11: >Referee< - referee
|
218
|
+
12: >Match Report< - match_report
|
219
|
+
13: >Notes< - notes=end
|
220
|
+
|
221
|
+
<tbody>
|
222
|
+
<tr >
|
223
|
+
<th scope="row" class="left " data-stat="round" >
|
224
|
+
<a href="/en/comps/56/3213/2019-2020-Austrian-Bundesliga-Stats">Regular Season</a>
|
225
|
+
</th>
|
226
|
+
<td class="right " data-stat="gameweek" >1</td>
|
227
|
+
<td class="left " data-stat="dayofweek" csk="6" >Fri</td>
|
228
|
+
<td class="left " data-stat="date" csk="20190726" ><a href="/en/matches/2019-07-26">2019-07-26</a></td>
|
229
|
+
<td class="right " data-stat="time" csk="20:45:00" ><span class="venuetime" data-venue-time-only="1" data-venue-epoch="1564166700" data-venue-time="20:45">20:45</span> <span class="localtime" data-label="your time"></span></td>
|
230
|
+
<td class="right " data-stat="squad_a" ><a href="/en/squads/912e4c40/2019-2020/Rapid-Wien-Stats">Rapid Wien</a></td>
|
231
|
+
<td class="center " data-stat="score" ><a href="/en/matches/341a27e4/Rapid-Wien-Red-Bull-Salzburg-July-26-2019-Austrian-Bundesliga">0–2</a></td>
|
232
|
+
<td class="left " style="font-weight: bold;" data-stat="squad_b" ><a href="/en/squads/50f2a074/2019-2020/Red-Bull-Salzburg-Stats">RB Salzburg</a></td>
|
233
|
+
<td class="right " data-stat="attendance" csk="24200" >24,200</td>
|
234
|
+
<td class="left " data-stat="venue" >Allianz Stadion</td>
|
235
|
+
<td class="left " data-stat="referee" csk="Alexander Harkam2019-07-26" >Alexander Harkam</td>
|
236
|
+
<td class="left " data-stat="match_report" ><a href="/en/matches/341a27e4/Rapid-Wien-Red-Bull-Salzburg-July-26-2019-Austrian-Bundesliga">Match Report</a></td>
|
237
|
+
<td class="left iz" data-stat="notes" ></td>
|
238
|
+
</tr>
|
239
|
+
<tr >
|
240
|
+
<th scope="row" class="left sort_show" data-stat="round" ><a href="/en/comps/56/3213/2019-2020-Austrian-Bundesliga-Stats">Regular Season</a></th>
|
241
|
+
<td class="right sort_show" data-stat="gameweek" >1</td><td class="left " data-stat="dayofweek" csk="7" >Sat</td><td class="left " data-stat="date" csk="20190727" ><a href="/en/matches/2019-07-27">2019-07-27</a></td><td class="right " data-stat="time" csk="17:00:00" ><span class="venuetime" data-venue-time-only="1" data-venue-epoch="1564239600" data-venue-time="17:00">17:00</span> <span class="localtime" data-label="your time"></span></td><td class="right " data-stat="squad_a" ><a href="/en/squads/d7d06475/2019-2020/Admira-Wacker-Modling-Stats">Admira</a></td><td class="center " data-stat="score" ><a href="/en/matches/c32792aa/Admira-Wacker-Modling-Wolfsberger-AC-July-27-2019-Austrian-Bundesliga">0–3</a></td><td class="left " style="font-weight: bold;" data-stat="squad_b" ><a href="/en/squads/426658a6/2019-2020/Wolfsberger-AC-Stats">Wolfsberger AC</a></td><td class="right " data-stat="attendance" csk="1900" >1,900</td><td class="left " data-stat="venue" >BSFZ-Arena</td><td class="left " data-stat="referee" csk="Christian-Petru Ciochirca2019-07-27" >Christian-Petru Ciochirca</td><td class="left " data-stat="match_report" ><a href="/en/matches/c32792aa/Admira-Wacker-Modling-Wolfsberger-AC-July-27-2019-Austrian-Bundesliga">Match Report</a></td><td class="left iz" data-stat="notes" ></td></tr>
|
242
|
+
<tr ><th scope="row" class="left sort_show" data-stat="round" ><a href="/en/comps/56/3213/2019-2020-Austrian-Bundesliga-Stats">Regular Season</a></th><td class="right sort_show" data-stat="gameweek" >1</td><td class="left sort_show" data-stat="dayofweek" csk="7" >Sat</td><td class="left sort_show" data-stat="date" csk="20190727" ><a href="/en/matches/2019-07-27">2019-07-27</a></td><td class="right " data-stat="time" csk="17:00:00" ><span class="venuetime" data-venue-time-only="1" data-venue-epoch="1564239600" data-venue-time="17:00">17:00</span> <span class="localtime" data-label="your time"></span></td><td class="right " style="font-weight: bold;" data-stat="squad_a" ><a href="/en/squads/c63dd2d5/2019-2020/WSG-Wattens-Stats">WSG Wattens</a></td><td class="center " data-stat="score" ><a href="/en/matches/1cbbfd76/WSG-Wattens-Austria-Wien-July-27-2019-Austrian-Bundesliga">3–1</a></td><td class="left " data-stat="squad_b" ><a href="/en/squads/ee0bccc5/2019-2020/Austria-Wien-Stats">Austria Wien</a></td><td class="right " data-stat="attendance" csk="4600" >4,600</td><td class="left " data-stat="venue" >Tivoli Stadion Tirol</td><td class="left " data-stat="referee" csk="Christopher Jäger2019-07-27" >Christopher Jäger</td><td class="left " data-stat="match_report" ><a href="/en/matches/1cbbfd76/WSG-Wattens-Austria-Wien-July-27-2019-Austrian-Bundesliga">Match Report</a></td><td class="left iz" data-stat="notes" ></td></tr>
|
243
|
+
<tr ><th scope="row" class="left sort_show" data-stat="round" ><a href="/en/comps/56/3213/2019-2020-Austrian-Bundesliga-Stats">Regular Season</a></th><td class="right sort_show" data-stat="gameweek" >1</td><td class="left " data-stat="dayofweek" csk="1" >Sun</td><td class="left " data-stat="date" csk="20190728" ><a href="/en/matches/2019-07-28">2019-07-28</a></td><td class="right " data-stat="time" csk="17:00:00" ><span class="venuetime" data-venue-time-only="1" data-venue-epoch="1564326000" data-venue-time="17:00">17:00</span> <span class="localtime" data-label="your time"></span></td><td class="right " style="font-weight: bold;" data-stat="squad_a" ><a href="/en/squads/d20821dd/2019-2020/LASK-Stats">LASK</a></td><td class="center " data-stat="score" ><a href="/en/matches/96a71a15/LASK-Rheindorf-Altach-July-28-2019-Austrian-Bundesliga">2–0</a></td><td class="left " data-stat="squad_b" ><a href="/en/squads/80beba99/2019-2020/Rheindorf-Altach-Stats">SCR Altach</a></td><td class="right " data-stat="attendance" csk="5333" >5,333</td><td class="left " data-stat="venue" >TGW Arena </td><td class="left " data-stat="referee" csk="Harald Lechner2019-07-28" >Harald Lechner</td><td class="left " data-stat="match_report" ><a href="/en/matches/96a71a15/LASK-Rheindorf-Altach-July-28-2019-Austrian-Bundesliga">Match Report</a></td><td class="left iz" data-stat="notes" ></td></tr>
|
244
|
+
<tr ><th scope="row" class="left sort_show" data-stat="round" ><a href="/en/comps/56/3213/2019-2020-Austrian-Bundesliga-Stats">Regular Season</a></th><td class="right sort_show" data-stat="gameweek" >1</td><td class="left sort_show" data-stat="dayofweek" csk="1" >Sun</td><td class="left sort_show" data-stat="date" csk="20190728" ><a href="/en/matches/2019-07-28">2019-07-28</a></td><td class="right " data-stat="time" csk="17:00:00" ><span class="venuetime" data-venue-time-only="1" data-venue-epoch="1564326000" data-venue-time="17:00">17:00</span> <span class="localtime" data-label="your time"></span></td><td class="right " style="font-weight: bold;" data-stat="squad_a" ><a href="/en/squads/2ff6d16e/Mattersburg-Stats">Mattersburg</a></td><td class="center " data-stat="score" ><a href="/en/matches/6ae7c604/Mattersburg-Hartberg-July-28-2019-Austrian-Bundesliga">2–1</a></td><td class="left " data-stat="squad_b" ><a href="/en/squads/f6d9c820/2019-2020/Hartberg-Stats">Hartberg</a></td><td class="right " data-stat="attendance" csk="2850" >2,850</td><td class="left " data-stat="venue" >Pappelstadion</td><td class="left " data-stat="referee" csk="Manuel Schüttengruber2019-07-28" >Manuel Schüttengruber</td><td class="left " data-stat="match_report" ><a href="/en/matches/6ae7c604/Mattersburg-Hartberg-July-28-2019-Austrian-Bundesliga">Match Report</a></td><td class="left iz" data-stat="notes" ></td></tr>
|
245
|
+
<tr ><th scope="row" class="left sort_show" data-stat="round" ><a href="/en/comps/56/3213/2019-2020-Austrian-Bundesliga-Stats">Regular Season</a></th><td class="right sort_show" data-stat="gameweek" >1</td><td class="left sort_show" data-stat="dayofweek" csk="1" >Sun</td><td class="left sort_show" data-stat="date" csk="20190728" ><a href="/en/matches/2019-07-28">2019-07-28</a></td><td class="right " data-stat="time" csk="17:00:00" ><span class="venuetime" data-venue-time-only="1" data-venue-epoch="1564326000" data-venue-time="17:00">17:00</span> <span class="localtime" data-label="your time"></span></td><td class="right " style="font-weight: bold;" data-stat="squad_a" ><a href="/en/squads/3f4fe568/2019-2020/Sturm-Graz-Stats">Sturm Graz</a></td><td class="center " data-stat="score" ><a href="/en/matches/0427bf0f/Sturm-Graz-St-Polten-July-28-2019-Austrian-Bundesliga">3–0</a></td><td class="left " data-stat="squad_b" ><a href="/en/squads/f722bd04/2019-2020/St-Polten-Stats">St. Pölten</a></td><td class="right " data-stat="attendance" csk="7194" >7,194</td><td class="left " data-stat="venue" >Merkur Arena</td><td class="left " data-stat="referee" csk="Walter Altmann2019-07-28" >Walter Altmann</td><td class="left " data-stat="match_report" ><a href="/en/matches/0427bf0f/Sturm-Graz-St-Polten-July-28-2019-Austrian-Bundesliga">Match Report</a></td><td class="left iz" data-stat="notes" ></td></tr>
|
246
|
+
<tr class="spacer partial_table" style="background-color:#ddd" >
|
247
|
+
<th scope="row" class="left iz" data-stat="round" ></th>
|
248
|
+
<td class="right iz" data-stat="gameweek" ></td>
|
249
|
+
<td class="left iz" data-stat="dayofweek" ></td>
|
250
|
+
<td class="left iz" data-stat="date" ></td>
|
251
|
+
<td class="right iz" data-stat="time" ></td>
|
252
|
+
<td class="right iz" data-stat="squad_a" ></td>
|
253
|
+
<td class="center iz" data-stat="score" ></td>
|
254
|
+
<td class="left iz" data-stat="squad_b" ></td>
|
255
|
+
<td class="right iz" data-stat="attendance" ></td>
|
256
|
+
<td class="left iz" data-stat="venue" ></td>
|
257
|
+
<td class="left iz" data-stat="referee" ></td>
|
258
|
+
<td class="left iz" data-stat="match_report" ></td>
|
259
|
+
<td class="left iz" data-stat="notes" ></td></tr>
|
260
|
+
<tr ><th scope="row" class="left sort_show" data-stat="round" ><a href="/en/comps/56/3213/2019-2020-Austrian-Bundesliga-Stats">Regular Season</a></th><td class="right " data-stat="gameweek" >2</td><td class="left " data-stat="dayofweek" csk="7" >Sat</td><td class="left " data-stat="date" csk="20190803" ><a href="/en/matches/2019-08-03">2019-08-03</a></td><td class="right " data-stat="time" csk="17:00:00" ><span class="venuetime" data-venue-time-only="1" data-venue-epoch="1564844400" data-venue-time="17:00">17:00</span> <span class="localtime" data-label="your time"></span></td><td class="right " data-stat="squad_a" ><a href="/en/squads/ee0bccc5/2019-2020/Austria-Wien-Stats">Austria Wien</a></td><td class="center " data-stat="score" ><a href="/en/matches/ec58586a/Austria-Wien-LASK-August-3-2019-Austrian-Bundesliga">0–3</a></td><td class="left " style="font-weight: bold;" data-stat="squad_b" ><a href="/en/squads/d20821dd/2019-2020/LASK-Stats">LASK</a></td><td class="right " data-stat="attendance" csk="9350" >9,350</td><td class="left " data-stat="venue" >Generali Arena</td><td class="left " data-stat="referee" csk="Sebastian Gishamer2019-08-03" >Sebastian Gishamer</td><td class="left " data-stat="match_report" ><a href="/en/matches/ec58586a/Austria-Wien-LASK-August-3-2019-Austrian-Bundesliga">Match Report</a></td><td class="left iz" data-stat="notes" ></td></tr>
|
261
|
+
<tr ><th scope="row" class="left sort_show" data-stat="round" ><a href="/en/comps/56/3213/2019-2020-Austrian-Bundesliga-Stats">Regular Season</a></th><td class="right sort_show" data-stat="gameweek" >2</td><td class="left sort_show" data-stat="dayofweek" csk="7" >Sat</td><td class="left sort_show" data-stat="date" csk="20190803" ><a href="/en/matches/2019-08-03">2019-08-03</a></td><td class="right " data-stat="time" csk="17:00:00" ><span class="venuetime" data-venue-time-only="1" data-venue-epoch="1564844400" data-venue-time="17:00">17:00</span> <span class="localtime" data-label="your time"></span></td><td class="right " style="font-weight: bold;" data-stat="squad_a" ><a href="/en/squads/80beba99/2019-2020/Rheindorf-Altach-Stats">SCR Altach</a></td><td class="center " data-stat="score" ><a href="/en/matches/df2d69d0/Rheindorf-Altach-WSG-Wattens-August-3-2019-Austrian-Bundesliga">3–2</a></td><td class="left " data-stat="squad_b" ><a href="/en/squads/c63dd2d5/2019-2020/WSG-Wattens-Stats">WSG Wattens</a></td><td class="right " data-stat="attendance" csk="4038" >4,038</td><td class="left " data-stat="venue" >CASHPOINT Arena</td><td class="left " data-stat="referee" csk="Gerhard Grobelnik2019-08-03" >Gerhard Grobelnik</td><td class="left " data-stat="match_report" ><a href="/en/matches/df2d69d0/Rheindorf-Altach-WSG-Wattens-August-3-2019-Austrian-Bundesliga">Match Report</a></td><td class="left iz" data-stat="notes" ></td></tr>
|
262
|
+
<tr ><th scope="row" class="left sort_show" data-stat="round" ><a href="/en/comps/56/3213/2019-2020-Austrian-Bundesliga-Stats">Regular Season</a></th><td class="right sort_show" data-stat="gameweek" >2</td><td class="left sort_show" data-stat="dayofweek" csk="7" >Sat</td><td class="left sort_show" data-stat="date" csk="20190803" ><a href="/en/matches/2019-08-03">2019-08-03</a></td><td class="right " data-stat="time" csk="17:00:00" ><span class="venuetime" data-venue-time-only="1" data-venue-epoch="1564844400" data-venue-time="17:00">17:00</span> <span class="localtime" data-label="your time"></span></td><td class="right " style="font-weight: bold;" data-stat="squad_a" ><a href="/en/squads/f6d9c820/2019-2020/Hartberg-Stats">Hartberg</a></td><td class="center " data-stat="score" ><a href="/en/matches/7d8949d5/Hartberg-Admira-Wacker-Modling-August-3-2019-Austrian-Bundesliga">4–1</a></td><td class="left " data-stat="squad_b" ><a href="/en/squads/d7d06475/2019-2020/Admira-Wacker-Modling-Stats">Admira</a></td><td class="right " data-stat="attendance" csk="2624" >2,624</td><td class="left " data-stat="venue" >PROfertil ARENA</td><td class="left " data-stat="referee" csk="Josef Spurny2019-08-03" >Josef Spurny</td><td class="left " data-stat="match_report" ><a href="/en/matches/7d8949d5/Hartberg-Admira-Wacker-Modling-August-3-2019-Austrian-Bundesliga">Match Report</a></td><td class="left iz" data-stat="notes" ></td></tr>
|
263
|
+
|
264
|
+
<tr ><th scope="row" class="left sort_show" data-stat="round" ><a href="/en/comps/56/3213/2019-2020-Austrian-Bundesliga-Stats">Championship round</a></th><td class="right sort_show" data-stat="gameweek" >10</td><td class="left sort_show" data-stat="dayofweek" csk="1" >Sun</td><td class="left sort_show" data-stat="date" csk="20200705" ><a href="/en/matches/2020-07-05">2020-07-05</a></td><td class="right " data-stat="time" csk="17:00:00" ><span class="venuetime" data-venue-time-only="1" data-venue-epoch="1593961200" data-venue-time="17:00">17:00</span> <span class="localtime" data-label="your time"></span></td><td class="right " style="font-weight: bold;" data-stat="squad_a" ><a href="/en/squads/426658a6/2019-2020/Wolfsberger-AC-Stats">Wolfsberger AC</a></td><td class="center " data-stat="score" ><a href="/en/matches/ee9840f1/Wolfsberger-AC-Rapid-Wien-July-5-2020-Austrian-Bundesliga">3–1</a></td><td class="left " data-stat="squad_b" ><a href="/en/squads/912e4c40/2019-2020/Rapid-Wien-Stats">Rapid Wien</a></td><td class="right iz" data-stat="attendance" csk="0" ></td><td class="left " data-stat="venue" >Lavanttal-Arena</td><td class="left " data-stat="referee" csk="Alexander Harkam2020-07-05" >Alexander Harkam</td><td class="left " data-stat="match_report" ><a href="/en/matches/ee9840f1/Wolfsberger-AC-Rapid-Wien-July-5-2020-Austrian-Bundesliga">Match Report</a></td><td class="left iz" data-stat="notes" ></td></tr>
|
265
|
+
<tr class="spacer partial_table" style="background-color:#ddd" >
|
266
|
+
<th scope="row" class="left iz" data-stat="round" ></th>
|
267
|
+
<td class="right iz" data-stat="gameweek" ></td>
|
268
|
+
<td class="left iz" data-stat="dayofweek" ></td>
|
269
|
+
<td class="left iz" data-stat="date" ></td>
|
270
|
+
<td class="right iz" data-stat="time" ></td>
|
271
|
+
<td class="right iz" data-stat="squad_a" ></td>
|
272
|
+
<td class="center iz" data-stat="score" ></td>
|
273
|
+
<td class="left iz" data-stat="squad_b" ></td><td class="right iz" data-stat="attendance" ></td><td class="left iz" data-stat="venue" ></td><td class="left iz" data-stat="referee" ></td><td class="left iz" data-stat="match_report" ></td><td class="left iz" data-stat="notes" ></td></tr>
|
274
|
+
<tr >
|
275
|
+
<th scope="row" class="left " data-stat="round" ><a href="/en/comps/56/3213/2019-2020-Austrian-Bundesliga-Stats">Semi-final</a></th>
|
276
|
+
<td class="right iz" data-stat="gameweek" ></td>
|
277
|
+
<td class="left " data-stat="dayofweek" csk="4" >Wed</td>
|
278
|
+
<td class="left " data-stat="date" csk="20200708" ><a href="/en/matches/2020-07-08">2020-07-08</a></td><td class="right " data-stat="time" csk="20:30:00" ><span class="venuetime" data-venue-time-only="1" data-venue-epoch="1594233000" data-venue-time="20:30">20:30</span> <span class="localtime" data-label="your time"></span></td><td class="right " style="font-weight: bold;" data-stat="squad_a" ><a href="/en/squads/ee0bccc5/2019-2020/Austria-Wien-Stats">Austria Wien</a></td><td class="center " data-stat="score" ><a href="/en/matches/6a1148ed/Austria-Wien-Rheindorf-Altach-July-8-2020-Austrian-Bundesliga">1–0</a></td><td class="left " data-stat="squad_b" ><a href="/en/squads/80beba99/2019-2020/Rheindorf-Altach-Stats">SCR Altach</a></td><td class="right iz" data-stat="attendance" csk="0" ></td><td class="left " data-stat="venue" >Generali Arena</td><td class="left " data-stat="referee" csk="Sebastian Gishamer2020-07-08" >Sebastian Gishamer</td><td class="left " data-stat="match_report" ><a href="/en/matches/6a1148ed/Austria-Wien-Rheindorf-Altach-July-8-2020-Austrian-Bundesliga">Match Report</a></td><td class="left iz" data-stat="notes" ></td></tr>
|
279
|
+
<tr ><th scope="row" class="left " data-stat="round" ><a href="/en/comps/56/3213/2019-2020-Austrian-Bundesliga-Stats">Finals</a></th><td class="right iz" data-stat="gameweek" ></td><td class="left " data-stat="dayofweek" csk="7" >Sat</td><td class="left " data-stat="date" csk="20200711" ><a href="/en/matches/2020-07-11">2020-07-11</a></td><td class="right " data-stat="time" csk="17:00:00" ><span class="venuetime" data-venue-time-only="1" data-venue-epoch="1594479600" data-venue-time="17:00">17:00</span> <span class="localtime" data-label="your time"></span></td><td class="right " data-stat="squad_a" ><a href="/en/squads/ee0bccc5/2019-2020/Austria-Wien-Stats">Austria Wien</a></td><td class="center " data-stat="score" ><a href="/en/matches/5be35bf7/Austria-Wien-Hartberg-July-11-2020-Austrian-Bundesliga">2–3</a></td><td class="left " style="font-weight: bold;" data-stat="squad_b" ><a href="/en/squads/f6d9c820/2019-2020/Hartberg-Stats">Hartberg</a></td><td class="right iz" data-stat="attendance" csk="0" ></td><td class="left " data-stat="venue" >Generali Arena</td><td class="left " data-stat="referee" csk="Christopher Jäger2020-07-11" >Christopher Jäger</td><td class="left " data-stat="match_report" ><a href="/en/matches/5be35bf7/Austria-Wien-Hartberg-July-11-2020-Austrian-Bundesliga">Match Report</a></td><td class="left " data-stat="notes" >Leg 1 of 2</td></tr>
|
280
|
+
<tr ><th scope="row" class="left sort_show" data-stat="round" ><a href="/en/comps/56/3213/2019-2020-Austrian-Bundesliga-Stats">Finals</a></th><td class="right iz" data-stat="gameweek" ></td><td class="left " data-stat="dayofweek" csk="4" >Wed</td><td class="left " data-stat="date" csk="20200715" ><a href="/en/matches/2020-07-15">2020-07-15</a></td><td class="right " data-stat="time" csk="20:30:00" ><span class="venuetime" data-venue-time-only="1" data-venue-epoch="1594837800" data-venue-time="20:30">20:30</span> <span class="localtime" data-label="your time"></span></td><td class="right " data-stat="squad_a" ><a href="/en/squads/f6d9c820/2019-2020/Hartberg-Stats">Hartberg</a></td><td class="center " data-stat="score" ><a href="/en/matches/c8376d96/Hartberg-Austria-Wien-July-15-2020-Austrian-Bundesliga">0–0</a></td><td class="left " data-stat="squad_b" ><a href="/en/squads/ee0bccc5/2019-2020/Austria-Wien-Stats">Austria Wien</a></td><td class="right iz" data-stat="attendance" csk="0" ></td><td class="left " data-stat="venue" >PROfertil ARENA</td><td class="left " data-stat="referee" csk="Manuel Schüttengruber2020-07-15" >Manuel Schüttengruber</td><td class="left " data-stat="match_report" ><a href="/en/matches/c8376d96/Hartberg-Austria-Wien-July-15-2020-Austrian-Bundesliga">Match Report</a></td><td class="left " data-stat="notes" >Leg 2 of 2; Hartberg won</td></tr>
|
281
|
+
|
282
|
+
|
283
|
+
<div class="sub_section_heading">
|
284
|
+
<button class="sr_preset tooltip visible active" type="button"
|
285
|
+
onclick="setTimeout(function(){sr_st_construct_stats_table_features('sched_ks_all'); }, 100);"
|
286
|
+
data-hide="[id^=all_sched_ks]" data-show="#all_sched_ks_all">All Rounds</button>
|
287
|
+
<button class="sr_preset tooltip visible " type="button"
|
288
|
+
onclick="setTimeout(function(){sr_st_construct_stats_table_features('sched_ks_3213_1'); }, 100);"
|
289
|
+
data-hide="[id^=all_sched_ks]" data-show="#all_sched_ks_3213_1">Regular Season</button>
|
290
|
+
<button class="sr_preset tooltip visible "
|
291
|
+
type="button" onclick="setTimeout(function(){sr_st_construct_stats_table_features('sched_ks_3213_2'); }, 100);" data-hide="[id^=all_sched_ks]"
|
292
|
+
data-show="#all_sched_ks_3213_2">Championship round</button>
|
293
|
+
<button class="sr_preset tooltip visible "
|
294
|
+
type="button" onclick="setTimeout(function(){sr_st_construct_stats_table_features('sched_ks_3213_3'); }, 100);" data-hide="[id^=all_sched_ks]"
|
295
|
+
data-show="#all_sched_ks_3213_3">Relegation round</button>
|
296
|
+
<button class="sr_preset tooltip visible "
|
297
|
+
type="button" onclick="setTimeout(function(){sr_st_construct_stats_table_features('sched_ks_3213_4'); }, 100);"
|
298
|
+
data-hide="[id^=all_sched_ks]" data-show="#all_sched_ks_3213_4">Europa League play-offs</button>
|
299
|
+
|
300
|
+
|
301
|
+
<tr ><th scope="row" class="right " data-stat="gameweek" >1</th><td class="left " data-stat="dayofweek" csk="7" >Sat</td><td class="left " data-stat="date" csk="20200912" ><a href="/en/matches/2020-09-12">2020-09-12</a></td><td class="right iz" data-stat="time" ></td><td class="right " data-stat="squad_a" ><a href="/en/squads/943e8050/Burnley-Stats">Burnley</a></td><td class="right iz" data-stat="xg_a" ></td><td class="center iz" data-stat="score" ></td><td class="right iz" data-stat="xg_b" ></td><td class="left " data-stat="squad_b" ><a href="/en/squads/19538871/Manchester-United-Stats">Manchester Utd</a></td><td class="right iz" data-stat="attendance" ></td><td class="left " data-stat="venue" >Turf Moor</td><td class="left iz" data-stat="referee" csk="2020-09-12" ></td><td class="left iz" data-stat="match_report" ></td><td class="left " data-stat="notes" >Match Postponed</td></tr>
|
302
|
+
<tr ><th scope="row" class="right sort_show" data-stat="gameweek" >1</th>
|
303
|
+
<td class="left sort_show" data-stat="dayofweek" csk="7" >Sat</td>
|
304
|
+
<td class="left sort_show" data-stat="date" csk="20200912" >
|
305
|
+
<a href="/en/matches/2020-09-12">2020-09-12</a></td>
|
306
|
+
<td class="right iz" data-stat="time" ></td>
|
307
|
+
<td class="right " data-stat="squad_a" ><a href="/en/squads/b8fd03ef/Manchester-City-Stats">Manchester City</a></td><td class="right iz" data-stat="xg_a" ></td><td class="center iz" data-stat="score" ></td><td class="right iz" data-stat="xg_b" ></td><td class="left " data-stat="squad_b" ><a href="/en/squads/8602292d/Aston-Villa-Stats">Aston Villa</a></td><td class="right iz" data-stat="attendance" ></td><td class="left " data-stat="venue" >Etihad Stadium</td><td class="left iz" data-stat="referee" csk="2020-09-12" ></td><td class="left iz" data-stat="match_report" ></td><td class="left " data-stat="notes" >Match Postponed</td></tr>
|
308
|
+
<tr ><th scope="row" class="right sort_show" data-stat="gameweek" >1</th><td class="left sort_show" data-stat="dayofweek" csk="7" >Sat</td><td class="left sort_show" data-stat="date" csk="20200912" ><a href="/en/matches/2020-09-12">2020-09-12</a></td><td class="right " data-stat="time" csk="12:30:00" ><span class="venuetime" data-venue-time-only="1" data-venue-epoch="1599910200" data-venue-time="12:30">12:30</span> <span class="localtime" data-label="your time"></span></td><td class="right " data-stat="squad_a" ><a href="/en/squads/fd962109/Fulham-Stats">Fulham</a></td><td class="right " data-stat="xg_a" >0.2</td><td class="center " data-stat="score" ><a href="/en/matches/bf52349b/Fulham-Arsenal-September-12-2020-Premier-League">0–3</a></td><td class="right " data-stat="xg_b" >1.8</td><td class="left " style="font-weight: bold;" data-stat="squad_b" ><a href="/en/squads/18bb7c10/Arsenal-Stats">Arsenal</a></td><td class="right iz" data-stat="attendance" csk="0" ></td><td class="left " data-stat="venue" >Craven Cottage</td><td class="left " data-stat="referee" csk="Chris Kavanagh2020-09-12" >Chris Kavanagh</td><td class="left " data-stat="match_report" ><a href="/en/matches/bf52349b/Fulham-Arsenal-September-12-2020-Premier-League">Match Report</a></td><td class="left iz" data-stat="notes" ></td></tr>
|
309
|
+
<tr ><th scope="row" class="right sort_show" data-stat="gameweek" >1</th><td class="left sort_show" data-stat="dayofweek" csk="7" >Sat</td><td class="left sort_show" data-stat="date" csk="20200912" ><a href="/en/matches/2020-09-12">2020-09-12</a></td><td class="right " data-stat="time" csk="15:00:00" ><span class="venuetime" data-venue-time-only="1" data-venue-epoch="1599919200" data-venue-time="15:00">15:00</span> <span class="localtime" data-label="your time"></span></td><td class="right " style="font-weight: bold;" data-stat="squad_a" ><a href="/en/squads/47c64c55/Crystal-Palace-Stats">Crystal Palace</a></td><td class="right " data-stat="xg_a" >0.7</td><td class="center " data-stat="score" ><a href="/en/matches/db261cb0/Crystal-Palace-Southampton-September-12-2020-Premier-League">1–0</a></td><td class="right " data-stat="xg_b" >0.8</td><td class="left " data-stat="squad_b" ><a href="/en/squads/33c895d4/Southampton-Stats">Southampton</a></td><td class="right iz" data-stat="attendance" csk="0" ></td><td class="left " data-stat="venue" >Selhurst Park</td><td class="left " data-stat="referee" csk="Jonathan Moss2020-09-12" >Jonathan Moss</td><td class="left " data-stat="match_report" ><a href="/en/matches/db261cb0/Crystal-Palace-Southampton-September-12-2020-Premier-League">Match Report</a></td><td class="left iz" data-stat="notes" ></td></tr>
|
310
|
+
<tr >
|
311
|
+
<th scope="row" class="right sort_show" data-stat="gameweek" >1</th>
|
312
|
+
<td class="left sort_show" data-stat="dayofweek" csk="7" >Sat</td>
|
313
|
+
<td class="left sort_show" data-stat="date" csk="20200912" ><a href="/en/matches/2020-09-12">2020-09-12</a></td>
|
314
|
+
<td class="right " data-stat="time" csk="17:30:00" >
|
315
|
+
<span class="venuetime" data-venue-time-only="1" data-venue-epoch="1599928200" data-venue-time="17:30">17:30</span>
|
316
|
+
<span class="localtime" data-label="your time"></span>
|
317
|
+
</td>
|
318
|
+
<td class="right " style="font-weight: bold;" data-stat="squad_a" ><a href="/en/squads/822bd0ba/Liverpool-Stats">Liverpool</a></td><td class="right " data-stat="xg_a" >3.3</td><td class="center " data-stat="score" ><a href="/en/matches/21b58926/Liverpool-Leeds-United-September-12-2020-Premier-League">4–3</a></td><td class="right " data-stat="xg_b" >0.6</td><td class="left " data-stat="squad_b" ><a href="/en/squads/5bfb9659/Leeds-United-Stats">Leeds United</a></td><td class="right iz" data-stat="attendance" csk="0" ></td><td class="left " data-stat="venue" >Anfield</td><td class="left " data-stat="referee" csk="Michael Oliver2020-09-12" >Michael Oliver</td><td class="left " data-stat="match_report" ><a href="/en/matches/21b58926/Liverpool-Leeds-United-September-12-2020-Premier-League">Match Report</a></td><td class="left iz" data-stat="notes" ></td></tr>
|
319
|
+
<tr ><th scope="row" class="right sort_show" data-stat="gameweek" >1</th><td class="left sort_show" data-stat="dayofweek" csk="7" >Sat</td><td class="left sort_show" data-stat="date" csk="20200912" ><a href="/en/matches/2020-09-12">2020-09-12</a></td><td class="right " data-stat="time" csk="20:00:00" ><span class="venuetime" data-venue-time-only="1" data-venue-epoch="1599937200" data-venue-time="20:00">20:00</span> <span class="localtime" data-label="your time"></span></td><td class="right " data-stat="squad_a" ><a href="/en/squads/7c21e445/West-Ham-United-Stats">West Ham</a></td><td class="right " data-stat="xg_a" >1.1</td><td class="center " data-stat="score" ><a href="/en/matches/78495ced/West-Ham-United-Newcastle-United-September-12-2020-Premier-League">0–2</a></td><td class="right " data-stat="xg_b" >1.5</td><td class="left " style="font-weight: bold;" data-stat="squad_b" ><a href="/en/squads/b2b47a98/Newcastle-United-Stats">Newcastle Utd</a></td><td class="right iz" data-stat="attendance" csk="0" ></td><td class="left " data-stat="venue" >London Stadium</td><td class="left " data-stat="referee" csk="Stuart Attwell2020-09-12" >Stuart Attwell</td><td class="left " data-stat="match_report" ><a href="/en/matches/78495ced/West-Ham-United-Newcastle-United-September-12-2020-Premier-League">Match Report</a></td><td class="left iz" data-stat="notes" ></td></tr>
|
320
|
+
|
321
|
+
=end
|
322
|
+
|