spielplan_saar 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +17 -0
- data/.simplecov +1 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.textile +2 -0
- data/Rakefile +6 -0
- data/lib/spielplan_saar.rb +5 -0
- data/lib/spielplan_saar/result_page_parser.rb +24 -0
- data/lib/spielplan_saar/table_entry.rb +24 -0
- data/lib/spielplan_saar/table_parser.rb +35 -0
- data/lib/spielplan_saar/version.rb +3 -0
- data/spec/dummy_spec.rb +6 -0
- data/spec/fixtures/result_page_parser_test_page_1.html +399 -0
- data/spec/result_page_parser_spec.rb +29 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/table_entry_spec.rb +28 -0
- data/spec/table_parser_spec.rb +43 -0
- data/spielplan_saar.gemspec +25 -0
- metadata +140 -0
data/.gitignore
ADDED
data/.simplecov
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
SimpleCov.start
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Robert Gogolok
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.textile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
3
|
+
module SpielplanSaar
|
4
|
+
|
5
|
+
class ResultPageParser
|
6
|
+
attr_reader :html_content
|
7
|
+
|
8
|
+
def initialize(html_content)
|
9
|
+
@html_content = html_content
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.parse(html_content)
|
13
|
+
self.new(html_content).parse
|
14
|
+
end
|
15
|
+
|
16
|
+
def parse
|
17
|
+
OpenStruct.new(:table => TableParser.new(html_content).parse)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module SpielplanSaar
|
2
|
+
TableEntry = Struct.new(:position, :team, :games, :points, :goals, :difference)
|
3
|
+
|
4
|
+
class TableEntry
|
5
|
+
|
6
|
+
def self.parse(row_node)
|
7
|
+
position = inner_text_at_position(row_node, 1)
|
8
|
+
team = inner_text_at_position(row_node, 2)
|
9
|
+
games = inner_text_at_position(row_node, 3)
|
10
|
+
points = inner_text_at_position(row_node, 4)
|
11
|
+
goals = inner_text_at_position(row_node, 5)
|
12
|
+
difference = inner_text_at_position(row_node, 6)
|
13
|
+
|
14
|
+
self.new(position, team, games, points, goals, difference)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def self.inner_text_at_position(row_node, position)
|
20
|
+
row_node.xpath(".//td[#{position}]").inner_text.strip
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
|
3
|
+
module SpielplanSaar
|
4
|
+
class TableParser
|
5
|
+
attr_reader :html_content
|
6
|
+
|
7
|
+
def initialize(html_content)
|
8
|
+
@html_content = html_content
|
9
|
+
end
|
10
|
+
|
11
|
+
def parse
|
12
|
+
table_row_nodes.collect do |row_node|
|
13
|
+
TableEntry.parse(row_node)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def doc
|
20
|
+
@doc ||= Nokogiri::HTML(html_content)
|
21
|
+
end
|
22
|
+
|
23
|
+
def table_node
|
24
|
+
@table_node ||= doc.xpath('//*[@id="logo_rechts_oben"]/form/table/tr/td/table/tr/td/table')[-3]
|
25
|
+
end
|
26
|
+
|
27
|
+
def table_row_nodes
|
28
|
+
@table_row_nodes ||=
|
29
|
+
begin
|
30
|
+
table_node.xpath('.//tr')[1..-1] # skip first entry
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
data/spec/dummy_spec.rb
ADDED
@@ -0,0 +1,399 @@
|
|
1
|
+
<script language='JavaScript'>
|
2
|
+
<!--
|
3
|
+
|
4
|
+
|
5
|
+
function kalender(datum, ebenen, feldname)
|
6
|
+
{
|
7
|
+
var ziel = 'kalender_anzeigen.php3?datum=';
|
8
|
+
|
9
|
+
for(i=1; i<= ebenen; i++)
|
10
|
+
ziel = '../' + ziel;
|
11
|
+
|
12
|
+
ziel = ziel + datum;
|
13
|
+
ziel = ziel + '&feld_name=';
|
14
|
+
ziel = ziel + feldname;
|
15
|
+
|
16
|
+
F1 = window.open(ziel,'Kalender','width=600,height=400,resizable=no,scrollbars=yes,screenX=0,screenY=0, status=yes');
|
17
|
+
window.F1.focus();
|
18
|
+
}
|
19
|
+
//-->
|
20
|
+
</script>
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
<html>
|
25
|
+
<head>
|
26
|
+
|
27
|
+
<script language="JavaScript">
|
28
|
+
<!--
|
29
|
+
function MM_jumpMenu(targ,selObj,restore){ //v3.0
|
30
|
+
eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
|
31
|
+
if (restore) selObj.selectedIndex=0;
|
32
|
+
}
|
33
|
+
|
34
|
+
function MM_findObj(n, d) { //v3.0
|
35
|
+
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
|
36
|
+
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
|
37
|
+
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
|
38
|
+
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); return x;
|
39
|
+
}
|
40
|
+
|
41
|
+
function MM_jumpMenuGo(selName,targ,restore){ //v3.0
|
42
|
+
var selObj = MM_findObj(selName); if (selObj) MM_jumpMenu(targ,selObj,restore);
|
43
|
+
}
|
44
|
+
//-->
|
45
|
+
</script>
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
<title>Handballverband Saar</title>
|
50
|
+
|
51
|
+
<meta name="author" content="internetFX">
|
52
|
+
<!--
|
53
|
+
|
54
|
+
Webdesign von
|
55
|
+
internetFX
|
56
|
+
|
57
|
+
Besuchen Sie unsere Internet-Seiten unter
|
58
|
+
http://www.internetFX.de
|
59
|
+
|
60
|
+
oder senden Sie uns eine E-Mail unter
|
61
|
+
info@internetFX.de
|
62
|
+
|
63
|
+
|
64
|
+
//-->
|
65
|
+
|
66
|
+
<link rel=stylesheet type='text/css' href='../css_style.css'>
|
67
|
+
|
68
|
+
|
69
|
+
|
70
|
+
</head>
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
<body bgcolor='#FFFFFF' text='#000000' link='#0007C4' vlink='#0007C4' alink='#0007A2' marginheight='0' marginwidth='0' leftmargin='0' topmargin='0' background='../../bilder/hg_leer.gif'>
|
76
|
+
<form method="post" action="index.php" name="formular">
|
77
|
+
|
78
|
+
<input type="hidden" name="auswahl_saison" value="$auswahl_saison">
|
79
|
+
|
80
|
+
<table width="100%" height="100%" border="0" bordercolor="#00047C" cellspacing="0" cellpadding="0" align="center">
|
81
|
+
<tr>
|
82
|
+
<td>
|
83
|
+
|
84
|
+
<table width="770" height="400" border="1" bordercolor="#00047C" cellspacing="0" cellpadding="0" align="center">
|
85
|
+
<tr>
|
86
|
+
<td height="30" bgcolor="#FFFFFF"> <b>Ergebnisse</b>
|
87
|
+
<a href="../spielplan/index.php?klassen_vorhanden=934&auswahl_saison=35" target="_self">Spielpläne</a>
|
88
|
+
|
89
|
+
<select name="auswahl_saison" onchange="document.getElementById('formular').submit()">
|
90
|
+
|
91
|
+
|
92
|
+
<option value='22'>Saison 2004/2005</option>
|
93
|
+
<option value='24'>Saison 2005/2006</option>
|
94
|
+
<option value='28'>Saison 2006/2007</option>
|
95
|
+
<option value='29'>Saison 2007/2008</option>
|
96
|
+
<option value='31'>Saison 2008/2009</option>
|
97
|
+
<option value='32'>Saison 2009/2010</option>
|
98
|
+
<option value='33'>Saison 2010/2011</option>
|
99
|
+
<option value='34'>Saison 2011/2012</option>
|
100
|
+
<option value='35' selected>Saison 2012/2013</option>
|
101
|
+
</select>
|
102
|
+
|
103
|
+
</td>
|
104
|
+
</tr>
|
105
|
+
<tr bgcolor="#FFFFFF">
|
106
|
+
<td valign="top" id="logo_rechts_oben">
|
107
|
+
</form>
|
108
|
+
|
109
|
+
|
110
|
+
<form method='post' action='tabelle_anzeigen.php3?klassen_vorhanden=934&auswahl_saison=35' name='formular'>
|
111
|
+
|
112
|
+
<input type='hidden' name='klassen_vorhanden' value='934'>
|
113
|
+
<input type='hidden' name='klassen_aufstiegsplaetze' value=''>
|
114
|
+
<input type='hidden' name='klassen_abstiegsplaetze' value=''><br><br>
|
115
|
+
<table width='100%' height='100%' border='0' bordercolor='#00047C' cellspacing='0' cellpadding='6' align='center'>
|
116
|
+
<tr>
|
117
|
+
<td height='40' valign='bottom'><b>Spielergebnisse der Saison Saison 2012/2013</b></td>
|
118
|
+
</tr>
|
119
|
+
<tr>
|
120
|
+
<td valign='top'><table width='40%' border='0' cellspacing='0' cellpadding='4' align='' bordercolorlight='#F7F3F7' bordercolordark='#F7F3F7'>
|
121
|
+
<tr>
|
122
|
+
<td colspan='2'>
|
123
|
+
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
|
130
|
+
<select name="select" onChange="MM_jumpMenu('self',this,0);MM_jumpMenuGo('select','self',0)">
|
131
|
+
|
132
|
+
|
133
|
+
<option value='index.php?klassen_vorhanden=936&auswahl_saison=35'>Saarlandliga M?nner</option>
|
134
|
+
<option value='index.php?klassen_vorhanden=954&auswahl_saison=35'>Saarlandliga Frauen</option>
|
135
|
+
<option value='index.php?klassen_vorhanden=935&auswahl_saison=35'>Verbandsliga Saar M?nner</option>
|
136
|
+
<option value='index.php?klassen_vorhanden=951&auswahl_saison=35'>Saarlandliga m?nnliche Jugend A</option>
|
137
|
+
<option value='index.php?klassen_vorhanden=919&auswahl_saison=35'>Saarlandliga weibliche Jugend A</option>
|
138
|
+
<option value='index.php?klassen_vorhanden=950&auswahl_saison=35'>Saarlandliga m?nnliche Jugend B</option>
|
139
|
+
<option value='index.php?klassen_vorhanden=921&auswahl_saison=35'>Saarlandliga weibliche Jugend B</option>
|
140
|
+
<option value='index.php?klassen_vorhanden=949&auswahl_saison=35'>Saarlandliga m?nnliche Jugend C</option>
|
141
|
+
<option value='index.php?klassen_vorhanden=920&auswahl_saison=35'>Saarlandliga weibliche Jugend C</option>
|
142
|
+
<option value='index.php?klassen_vorhanden=952&auswahl_saison=35'>Saarlandliga m?nnliche Jugend D</option>
|
143
|
+
<option value='index.php?klassen_vorhanden=934&auswahl_saison=35' selected>Bezirksliga Ost M?nner</option>
|
144
|
+
<option value='index.php?klassen_vorhanden=940&auswahl_saison=35'>Bezirksliga West M?nner</option>
|
145
|
+
<option value='index.php?klassen_vorhanden=953&auswahl_saison=35'>Bezirksliga Ost Frauen</option>
|
146
|
+
<option value='index.php?klassen_vorhanden=942&auswahl_saison=35'>Bezirksliga West Frauen</option>
|
147
|
+
<option value='index.php?klassen_vorhanden=955&auswahl_saison=35'>A - Liga Ost Frauen</option>
|
148
|
+
<option value='index.php?klassen_vorhanden=943&auswahl_saison=35'>A - Liga West Frauen Staffel Nord</option>
|
149
|
+
<option value='index.php?klassen_vorhanden=944&auswahl_saison=35'>A - Liga West Frauen Staffel S?d</option>
|
150
|
+
<option value='index.php?klassen_vorhanden=933&auswahl_saison=35'>A - Liga Ost M?nner</option>
|
151
|
+
<option value='index.php?klassen_vorhanden=938&auswahl_saison=35'>A - Liga West M?nner</option>
|
152
|
+
<option value='index.php?klassen_vorhanden=932&auswahl_saison=35'>B - Liga Ost M?nner Staffel I</option>
|
153
|
+
<option value='index.php?klassen_vorhanden=931&auswahl_saison=35'>B - Liga Ost M?nner Staffel II</option>
|
154
|
+
<option value='index.php?klassen_vorhanden=939&auswahl_saison=35'>B - Liga West M?nner Staffel Nord</option>
|
155
|
+
<option value='index.php?klassen_vorhanden=941&auswahl_saison=35'>B - Liga West M?nner Staffel S?d</option>
|
156
|
+
<option value='index.php?klassen_vorhanden=945&auswahl_saison=35'>M?nnliche Jugend A</option>
|
157
|
+
<option value='index.php?klassen_vorhanden=927&auswahl_saison=35'>Weibliche Jugend A</option>
|
158
|
+
<option value='index.php?klassen_vorhanden=948&auswahl_saison=35'>M?nnliche Jugend B Ost</option>
|
159
|
+
<option value='index.php?klassen_vorhanden=923&auswahl_saison=35'>M?nnliche Jugend B West</option>
|
160
|
+
<option value='index.php?klassen_vorhanden=926&auswahl_saison=35'>Weibliche Jugend B Ost</option>
|
161
|
+
<option value='index.php?klassen_vorhanden=928&auswahl_saison=35'>Weibliche Jugend B West</option>
|
162
|
+
<option value='index.php?klassen_vorhanden=947&auswahl_saison=35'>M?nnliche Jugend C Ost</option>
|
163
|
+
<option value='index.php?klassen_vorhanden=946&auswahl_saison=35'>M?nnliche Jugend C Mitte</option>
|
164
|
+
<option value='index.php?klassen_vorhanden=922&auswahl_saison=35'>M?nnliche Jugend C West</option>
|
165
|
+
<option value='index.php?klassen_vorhanden=924&auswahl_saison=35'>Weibliche Jugend C Ost</option>
|
166
|
+
<option value='index.php?klassen_vorhanden=925&auswahl_saison=35'>Weibliche Jugend C West</option>
|
167
|
+
<option value='index.php?klassen_vorhanden=912&auswahl_saison=35'>M?nnliche Jugend D Ost</option>
|
168
|
+
<option value='index.php?klassen_vorhanden=911&auswahl_saison=35'>M?nnliche Jugend D Mitte</option>
|
169
|
+
<option value='index.php?klassen_vorhanden=937&auswahl_saison=35'>M?nnliche Jugend D West</option>
|
170
|
+
<option value='index.php?klassen_vorhanden=917&auswahl_saison=35'>Weibliche Jugend D Ost</option>
|
171
|
+
<option value='index.php?klassen_vorhanden=929&auswahl_saison=35'>Weibliche Jugend D West</option>
|
172
|
+
<option value='index.php?klassen_vorhanden=913&auswahl_saison=35'>M?nnliche Jugend E Ost Staffel Nord</option>
|
173
|
+
<option value='index.php?klassen_vorhanden=914&auswahl_saison=35'>M?nnliche Jugend E Ost Staffel S?d</option>
|
174
|
+
<option value='index.php?klassen_vorhanden=910&auswahl_saison=35'>M?nnliche Jugend E West Staffel Nord</option>
|
175
|
+
<option value='index.php?klassen_vorhanden=909&auswahl_saison=35'>M?nnliche Jugend E West Staffel S?d</option>
|
176
|
+
<option value='index.php?klassen_vorhanden=916&auswahl_saison=35'>Weibliche Jugend E Ost</option>
|
177
|
+
<option value='index.php?klassen_vorhanden=930&auswahl_saison=35'>Weibliche Jugend E West</option>
|
178
|
+
<option value='index.php?klassen_vorhanden=915&auswahl_saison=35'>gemischte Jugend F Ost</option>
|
179
|
+
<option value='index.php?klassen_vorhanden=908&auswahl_saison=35'>gemischte Jugend F West</option>
|
180
|
+
</select>
|
181
|
+
</font></td>
|
182
|
+
</tr>
|
183
|
+
|
184
|
+
</table><br><table width='100%' border='0' cellspacing='0' cellpadding='2' align='center' bordercolorlight='#F7F3F7' bordercolordark='#F7F3F7'>
|
185
|
+
<tr><td width='81%' colspan='2'>Datum: 20.10.2012<br><br><table width='80%' border='1' cellspacing='0' cellpadding='4' align='' bordercolorlight='#F7F3F7' bordercolordark='#F7F3F7'>
|
186
|
+
<tr bgcolor=''>
|
187
|
+
<td align='left' width='30%'><font size='2'>Datum - Uhrzeit</font></td>
|
188
|
+
<td align='left' width='60%'><font size='2'>Spielpaarung</font></td>
|
189
|
+
<td align='left' width='10%'><font size='2'>Ergebnis</font></td>
|
190
|
+
</tr>
|
191
|
+
<tr>
|
192
|
+
<td align='left'><font size='1'>13.10.2012 17:30 Uhr</font></td>
|
193
|
+
<td align='left'><font size='1'>SGH Sankt Ingbert II - HSV Wemmetsweiler I</font></td>
|
194
|
+
<td align='center'><font size='1'>27 : 23</font></td>
|
195
|
+
</tr>
|
196
|
+
<tr>
|
197
|
+
<td align='left'><font size='1'>13.10.2012 20:00 Uhr</font></td>
|
198
|
+
<td align='left'><font size='1'>HSG Bexbach/H?chen I - HWE Erbach/Waldmohr I</font></td>
|
199
|
+
<td align='center'><font size='1'>31 : 32</font></td>
|
200
|
+
</tr>
|
201
|
+
<tr>
|
202
|
+
<td align='left'><font size='1'>14.10.2012 18:30 Uhr</font></td>
|
203
|
+
<td align='left'><font size='1'>HSV Wemmetsweiler II - SV 64 Zweibr?cken III</font></td>
|
204
|
+
<td align='center'><font size='1'>25 : 30</font></td>
|
205
|
+
</tr>
|
206
|
+
<tr>
|
207
|
+
<td align='left'><font size='1'>14.10.2012 19:00 Uhr</font></td>
|
208
|
+
<td align='left'><font size='1'>HSG DJK Nordsaar II - HSG Spiesen/Elversberg I</font></td>
|
209
|
+
<td align='center'><font size='1'>22 : 14</font></td>
|
210
|
+
</tr></table><br><table width='80%' border='1' cellspacing='0' cellpadding='4' align='' bordercolorlight='#F7F3F7' bordercolordark='#F7F3F7'>
|
211
|
+
<tr bgcolor=''>
|
212
|
+
<td align='left' width='30%'><font size='2'>Datum - Uhrzeit</font></td>
|
213
|
+
<td align='left' width='60%'><font size='2'>Spielpaarung</font></td>
|
214
|
+
<td align='left' width='10%'><font size='2'>Ergebnis</font></td>
|
215
|
+
</tr>
|
216
|
+
<tr>
|
217
|
+
<td align='left'><font size='1'>19.10.2012 18:10 Uhr</font></td>
|
218
|
+
<td align='left'><font size='1'>RW Schaumberg/Sotzweiler I - SG Ommersheim/A?weiler I</font></td>
|
219
|
+
<td align='center'><font size='1'>- : -</font></td>
|
220
|
+
</tr></table><br><table width='80%' border='1' cellspacing='0' cellpadding='4' align='' bordercolorlight='#F7F3F7' bordercolordark='#F7F3F7'>
|
221
|
+
<tr bgcolor=''>
|
222
|
+
<td align='left' width='30%'><font size='2'>Datum - Uhrzeit</font></td>
|
223
|
+
<td align='left' width='60%'><font size='2'>Spielpaarung</font></td>
|
224
|
+
<td align='left' width='10%'><font size='2'>Ergebnis</font></td>
|
225
|
+
</tr>
|
226
|
+
<tr>
|
227
|
+
<td align='left'><font size='1'>28.10.2012 16:00 Uhr</font></td>
|
228
|
+
<td align='left'><font size='1'>TV Merchweiler II - MSG HF Illtal III</font></td>
|
229
|
+
<td align='center'><font size='1'>- : -</font></td>
|
230
|
+
</tr>
|
231
|
+
<tr>
|
232
|
+
<td align='left'><font size='1'>28.10.2012 19:00 Uhr</font></td>
|
233
|
+
<td align='left'><font size='1'>HSG Bexbach/H?chen I - HSV Wemmetsweiler II</font></td>
|
234
|
+
<td align='center'><font size='1'>- : -</font></td>
|
235
|
+
</tr></table>
|
236
|
+
</td>
|
237
|
+
</tr>
|
238
|
+
<tr>
|
239
|
+
<td colspan='2'><p> <table width='80%' border='0' cellspacing='0' cellpadding='0' align='' bordercolorlight='#F7F3F7' bordercolordark='#F7F3F7'>
|
240
|
+
<tr>
|
241
|
+
<td align='center'><a href='counter.php?banner_id=3&anzeige_flag=1' target='_blank'><img src='../../bilder_werbebanner/3.jpg' border='0'></a> </td>
|
242
|
+
</tr>
|
243
|
+
</table><br><br>
|
244
|
+
</td>
|
245
|
+
</tr>
|
246
|
+
<tr>
|
247
|
+
<td width='81%'><table width='100%' border='1' cellspacing='0' cellpadding='4' align='left' bordercolorlight='#F7F3F7' bordercolordark='#F7F3F7'>
|
248
|
+
<tr bgcolor='#D6DBDE'>
|
249
|
+
<td align='center' width='5%'><font size='2'>Pos</font></td>
|
250
|
+
<td align='left' width='35%'><font size='2'>Mannschaft</font></td>
|
251
|
+
<td align='center' width='5%'><font size='2'>Spiele</font></td>
|
252
|
+
<td align='center' width='10%'><font size='2'>Punkte</font></td>
|
253
|
+
<td align='center' width='10%'><font size='2'>Tore</font></td>
|
254
|
+
<td align='center' width='10%'><font size='2'>Differenz</font></td>
|
255
|
+
</tr>
|
256
|
+
<tr bgcolor=''>
|
257
|
+
<td align='center'><font size='2'>1</font></td>
|
258
|
+
<td align='left'><font size='2'>SGH Sankt Ingbert II</font></td>
|
259
|
+
<td align='center'><font size='2'>5</font></td>
|
260
|
+
<td align='center'><font size='2'>8 : 2</font></td>
|
261
|
+
<td align='center'><font size='2'>166 : 118</font></td>
|
262
|
+
<td align='center'><font size='2'>48</font></td>
|
263
|
+
</tr>
|
264
|
+
<tr bgcolor=''>
|
265
|
+
<td align='center'><font size='2'>2</font></td>
|
266
|
+
<td align='left'><font size='2'>HWE Erbach/Waldmohr I</font></td>
|
267
|
+
<td align='center'><font size='2'>5</font></td>
|
268
|
+
<td align='center'><font size='2'>8 : 2</font></td>
|
269
|
+
<td align='center'><font size='2'>160 : 142</font></td>
|
270
|
+
<td align='center'><font size='2'>18</font></td>
|
271
|
+
</tr>
|
272
|
+
<tr bgcolor=''>
|
273
|
+
<td align='center'><font size='2'>3</font></td>
|
274
|
+
<td align='left'><font size='2'>HSG Spiesen/Elversberg I</font></td>
|
275
|
+
<td align='center'><font size='2'>5</font></td>
|
276
|
+
<td align='center'><font size='2'>7 : 3</font></td>
|
277
|
+
<td align='center'><font size='2'>126 : 107</font></td>
|
278
|
+
<td align='center'><font size='2'>19</font></td>
|
279
|
+
</tr>
|
280
|
+
<tr bgcolor=''>
|
281
|
+
<td align='center'><font size='2'>4</font></td>
|
282
|
+
<td align='left'><font size='2'>HSV Wemmetsweiler I</font></td>
|
283
|
+
<td align='center'><font size='2'>6</font></td>
|
284
|
+
<td align='center'><font size='2'>7 : 5</font></td>
|
285
|
+
<td align='center'><font size='2'>175 : 166</font></td>
|
286
|
+
<td align='center'><font size='2'>9</font></td>
|
287
|
+
</tr>
|
288
|
+
<tr bgcolor=''>
|
289
|
+
<td align='center'><font size='2'>5</font></td>
|
290
|
+
<td align='left'><font size='2'>HSG DJK Nordsaar II</font></td>
|
291
|
+
<td align='center'><font size='2'>6</font></td>
|
292
|
+
<td align='center'><font size='2'>7 : 5</font></td>
|
293
|
+
<td align='center'><font size='2'>155 : 152</font></td>
|
294
|
+
<td align='center'><font size='2'>3</font></td>
|
295
|
+
</tr>
|
296
|
+
<tr bgcolor=''>
|
297
|
+
<td align='center'><font size='2'>6</font></td>
|
298
|
+
<td align='left'><font size='2'>SG Ommersheim/A?weiler I</font></td>
|
299
|
+
<td align='center'><font size='2'>5</font></td>
|
300
|
+
<td align='center'><font size='2'>6 : 4</font></td>
|
301
|
+
<td align='center'><font size='2'>118 : 112</font></td>
|
302
|
+
<td align='center'><font size='2'>6</font></td>
|
303
|
+
</tr>
|
304
|
+
<tr bgcolor=''>
|
305
|
+
<td align='center'><font size='2'>7</font></td>
|
306
|
+
<td align='left'><font size='2'>RW Schaumberg/Sotzweiler I</font></td>
|
307
|
+
<td align='center'><font size='2'>5</font></td>
|
308
|
+
<td align='center'><font size='2'>6 : 4</font></td>
|
309
|
+
<td align='center'><font size='2'>128 : 131</font></td>
|
310
|
+
<td align='center'><font size='2'>-3</font></td>
|
311
|
+
</tr>
|
312
|
+
<tr bgcolor=''>
|
313
|
+
<td align='center'><font size='2'>8</font></td>
|
314
|
+
<td align='left'><font size='2'>TV Merchweiler II</font></td>
|
315
|
+
<td align='center'><font size='2'>5</font></td>
|
316
|
+
<td align='center'><font size='2'>6 : 4</font></td>
|
317
|
+
<td align='center'><font size='2'>128 : 137</font></td>
|
318
|
+
<td align='center'><font size='2'>-9</font></td>
|
319
|
+
</tr>
|
320
|
+
<tr bgcolor=''>
|
321
|
+
<td align='center'><font size='2'>9</font></td>
|
322
|
+
<td align='left'><font size='2'>HSG Bexbach/H?chen I</font></td>
|
323
|
+
<td align='center'><font size='2'>4</font></td>
|
324
|
+
<td align='center'><font size='2'>5 : 3</font></td>
|
325
|
+
<td align='center'><font size='2'>124 : 99</font></td>
|
326
|
+
<td align='center'><font size='2'>25</font></td>
|
327
|
+
</tr>
|
328
|
+
<tr bgcolor=''>
|
329
|
+
<td align='center'><font size='2'>10</font></td>
|
330
|
+
<td align='left'><font size='2'>SV 64 Zweibr?cken III</font></td>
|
331
|
+
<td align='center'><font size='2'>6</font></td>
|
332
|
+
<td align='center'><font size='2'>2 : 10</font></td>
|
333
|
+
<td align='center'><font size='2'>148 : 176</font></td>
|
334
|
+
<td align='center'><font size='2'>-28</font></td>
|
335
|
+
</tr>
|
336
|
+
<tr bgcolor=''>
|
337
|
+
<td align='center'><font size='2'>11</font></td>
|
338
|
+
<td align='left'><font size='2'>HSV Wemmetsweiler II</font></td>
|
339
|
+
<td align='center'><font size='2'>5</font></td>
|
340
|
+
<td align='center'><font size='2'>0 : 10</font></td>
|
341
|
+
<td align='center'><font size='2'>95 : 131</font></td>
|
342
|
+
<td align='center'><font size='2'>-36</font></td>
|
343
|
+
</tr>
|
344
|
+
<tr bgcolor=''>
|
345
|
+
<td align='center'><font size='2'>12</font></td>
|
346
|
+
<td align='left'><font size='2'>MSG HF Illtal III</font></td>
|
347
|
+
<td align='center'><font size='2'>5</font></td>
|
348
|
+
<td align='center'><font size='2'>0 : 10</font></td>
|
349
|
+
<td align='center'><font size='2'>130 : 182</font></td>
|
350
|
+
<td align='center'><font size='2'>-52</font></td>
|
351
|
+
</tr>
|
352
|
+
</td></tr>
|
353
|
+
</table>
|
354
|
+
</td>
|
355
|
+
<td valign='top' width='19%'><table width='80' border='0' cellspacing='0' cellpadding='2' align='center' bordercolorlight='#F7F3F7' bordercolordark='#F7F3F7'>
|
356
|
+
<tr>
|
357
|
+
<td align='left' width='80' colspan='2'><b>Legende</b></td>
|
358
|
+
</tr>
|
359
|
+
<tr>
|
360
|
+
<td height='1' colspan='2' bgcolor='#000000'></td>
|
361
|
+
</tr>
|
362
|
+
<tr>
|
363
|
+
<td height='10'></td>
|
364
|
+
</tr>
|
365
|
+
<tr>
|
366
|
+
<td align='left' bgcolor='#98fb98' width='25'></td>
|
367
|
+
<td align='left' width='55'><font size='1'>Aufstiegsplatz</font></td>
|
368
|
+
</tr>
|
369
|
+
<tr>
|
370
|
+
<td align='left' bgcolor='#ffe4e1' width='25'> </td>
|
371
|
+
<td align='left' width='55'><font size='1'>Abstiegsplatz</font></td>
|
372
|
+
</tr>
|
373
|
+
<tr>
|
374
|
+
<td height='10'></td>
|
375
|
+
</tr>
|
376
|
+
<tr>
|
377
|
+
<td><a href='tabelle_drucken.php?klassen_id=934' target='_blank'><img width='25' src='../../bilder/print.gif' border='0' alt='Tabelle ausdrucken'></a></td>
|
378
|
+
<td><a href='tabelle_drucken.php?klassen_id=934' target='_blank'>Ausdrucken</a></td>
|
379
|
+
</tr>
|
380
|
+
</table>
|
381
|
+
|
382
|
+
</td>
|
383
|
+
</tr>
|
384
|
+
<tr>
|
385
|
+
<td colspan='2'><p> <table width='80%' border='0' cellspacing='0' cellpadding='0' align='' bordercolorlight='#F7F3F7' bordercolordark='#F7F3F7'>
|
386
|
+
<tr>
|
387
|
+
</tr>
|
388
|
+
</table>
|
389
|
+
</td></tr>
|
390
|
+
</table>
|
391
|
+
</form>
|
392
|
+
</table>
|
393
|
+
|
394
|
+
|
395
|
+
</td></tr></table>
|
396
|
+
<table width="770" align="center"><tr><td> </td><td align="right"><a href="http://www.internetfx.de" target="_blank"><font size="1" color="#AAAAAA">powered by InternetFX</font></a></td></tr></table>
|
397
|
+
</td></tr></table>
|
398
|
+
</body>
|
399
|
+
</html>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require_relative "../lib/spielplan_saar/table_entry"
|
3
|
+
require_relative "../lib/spielplan_saar/result_page_parser"
|
4
|
+
require_relative "../lib/spielplan_saar/table_parser"
|
5
|
+
|
6
|
+
describe SpielplanSaar::ResultPageParser do
|
7
|
+
|
8
|
+
describe ".parse" do
|
9
|
+
|
10
|
+
let(:html_content) do
|
11
|
+
File.open(File.join(FIXTURE_PATH, 'result_page_parser_test_page_1.html'))
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:result_object) { SpielplanSaar::ResultPageParser.parse(html_content) }
|
15
|
+
|
16
|
+
it "should parse html content" do
|
17
|
+
result_object.should be
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "result table" do
|
21
|
+
it "should return a table" do
|
22
|
+
result_object.table.should be
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require_relative "../lib/spielplan_saar/table_entry"
|
3
|
+
|
4
|
+
describe SpielplanSaar::TableEntry do
|
5
|
+
describe ".parse" do
|
6
|
+
let (:entry1) do
|
7
|
+
html_content = <<-EOF
|
8
|
+
<tr bgcolor="">
|
9
|
+
<td align="center"><font size="2">12</font></td>
|
10
|
+
<td align="left"><font size="2">TV Heiligenwald I</font></td>
|
11
|
+
<td align="center"><font size="2">4</font></td>
|
12
|
+
<td align="center"><font size="2">0 : 8</font></td>
|
13
|
+
<td align="center"><font size="2">107 : 148</font></td>
|
14
|
+
<td align="center"><font size="2">-41</font></td>
|
15
|
+
</tr>
|
16
|
+
EOF
|
17
|
+
row_node = Nokogiri::HTML(html_content)
|
18
|
+
SpielplanSaar::TableEntry.parse(row_node)
|
19
|
+
end
|
20
|
+
|
21
|
+
it { entry1.position.should eq('12') }
|
22
|
+
it { entry1.team.should eq('TV Heiligenwald I') }
|
23
|
+
it { entry1.games.should eq('4') }
|
24
|
+
it { entry1.points.should eq('0 : 8') }
|
25
|
+
it { entry1.goals.should eq('107 : 148') }
|
26
|
+
it { entry1.difference.should eq('-41') }
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require_relative "../lib/spielplan_saar/table_parser"
|
3
|
+
|
4
|
+
describe SpielplanSaar::TableParser do
|
5
|
+
|
6
|
+
describe "#initialize" do
|
7
|
+
|
8
|
+
let(:html_content) do
|
9
|
+
File.open(File.join(FIXTURE_PATH, 'result_page_parser_test_page_1.html'))
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:result_object) { SpielplanSaar::TableParser.new(html_content).parse }
|
13
|
+
|
14
|
+
it "should parse html content" do
|
15
|
+
result_object.should be
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "result table" do
|
19
|
+
|
20
|
+
it "should have many entries" do
|
21
|
+
result_object.size.should be > 0
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "test page 1" do
|
25
|
+
|
26
|
+
it "should have size 12" do
|
27
|
+
result_object.size.should be 12
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "third entry" do
|
31
|
+
let(:third_entry) { result_object[2] }
|
32
|
+
|
33
|
+
it { third_entry.position.should eq('3') }
|
34
|
+
it { third_entry.team.should eq('HSG Spiesen/Elversberg I') }
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'spielplan_saar/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "spielplan_saar"
|
8
|
+
gem.version = SpielplanSaar::VERSION
|
9
|
+
gem.authors = ["Robert Gogolok"]
|
10
|
+
gem.email = ["gogolok@gmail.com"]
|
11
|
+
gem.description = %q{Handball Spielplan Saar Parser}
|
12
|
+
gem.summary = %q{Handball Spielplan Saar Parser}
|
13
|
+
gem.homepage = ""
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_development_dependency(%q<rspec>,[">= 2.11.0"])
|
21
|
+
gem.add_development_dependency(%q<simplecov>,[">= 0.6.4"])
|
22
|
+
gem.add_development_dependency(%q<rake>, [">= 0.9.2.2"])
|
23
|
+
|
24
|
+
gem.add_dependency(%q<nokogiri>, [">= 1.5.5"])
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: spielplan_saar
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Robert Gogolok
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-10-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.11.0
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 2.11.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: simplecov
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 0.6.4
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.6.4
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.9.2.2
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.9.2.2
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: nokogiri
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 1.5.5
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.5.5
|
78
|
+
description: Handball Spielplan Saar Parser
|
79
|
+
email:
|
80
|
+
- gogolok@gmail.com
|
81
|
+
executables: []
|
82
|
+
extensions: []
|
83
|
+
extra_rdoc_files: []
|
84
|
+
files:
|
85
|
+
- .gitignore
|
86
|
+
- .simplecov
|
87
|
+
- .travis.yml
|
88
|
+
- Gemfile
|
89
|
+
- LICENSE.txt
|
90
|
+
- README.textile
|
91
|
+
- Rakefile
|
92
|
+
- lib/spielplan_saar.rb
|
93
|
+
- lib/spielplan_saar/result_page_parser.rb
|
94
|
+
- lib/spielplan_saar/table_entry.rb
|
95
|
+
- lib/spielplan_saar/table_parser.rb
|
96
|
+
- lib/spielplan_saar/version.rb
|
97
|
+
- spec/dummy_spec.rb
|
98
|
+
- spec/fixtures/result_page_parser_test_page_1.html
|
99
|
+
- spec/result_page_parser_spec.rb
|
100
|
+
- spec/spec_helper.rb
|
101
|
+
- spec/table_entry_spec.rb
|
102
|
+
- spec/table_parser_spec.rb
|
103
|
+
- spielplan_saar.gemspec
|
104
|
+
homepage: ''
|
105
|
+
licenses: []
|
106
|
+
post_install_message:
|
107
|
+
rdoc_options: []
|
108
|
+
require_paths:
|
109
|
+
- lib
|
110
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ! '>='
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
segments:
|
117
|
+
- 0
|
118
|
+
hash: -3494461263371807005
|
119
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
+
none: false
|
121
|
+
requirements:
|
122
|
+
- - ! '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
segments:
|
126
|
+
- 0
|
127
|
+
hash: -3494461263371807005
|
128
|
+
requirements: []
|
129
|
+
rubyforge_project:
|
130
|
+
rubygems_version: 1.8.24
|
131
|
+
signing_key:
|
132
|
+
specification_version: 3
|
133
|
+
summary: Handball Spielplan Saar Parser
|
134
|
+
test_files:
|
135
|
+
- spec/dummy_spec.rb
|
136
|
+
- spec/fixtures/result_page_parser_test_page_1.html
|
137
|
+
- spec/result_page_parser_spec.rb
|
138
|
+
- spec/spec_helper.rb
|
139
|
+
- spec/table_entry_spec.rb
|
140
|
+
- spec/table_parser_spec.rb
|