uses
System.Generics.Collections, System.RegularExpressions, System.Net.HttpClientComponent;
type
TGame =
class
Category:
string;
StartTime:
string;
Opponent1, Opponent2:
string;
URL:
string;
MatchResult1, MatchResult2:
string;
end;
function LoadHtml(
const AUrl:
string):
string;
var
NetHTTPClient: TNetHTTPClient;
begin
NetHTTPClient := TNetHTTPClient.Create(
nil);
try
Result := NetHTTPClient.get(AUrl).ContentAsString;
finally
NetHTTPClient.Free;
end;
end;
function ParseGameLine(
const AValue:
string): TGame;
var
RegEx: TRegEx;
Match: TMatch;
begin
RegEx := TRegEx.Create('
<span>([0-9:]*)<\/span>([a-zA-Z]*) - ([a-zA-Z]*) ?<a href="([\/a-zA-Z0-9]*)" class="sched">([0-9\-]*):([0-9\-]*)<\/a>');
Match := RegEx.Match(AValue);
if Match.Success
then
begin
Result := TGame.Create;
Result.StartTime := Match.Groups[1].Value;
Result.Opponent1 := Match.Groups[2].Value;
Result.Opponent2 := Match.Groups[3].Value;
Result.URL := Match.Groups[4].Value;
Result.MatchResult1 := Match.Groups[5].Value;
Result.MatchResult2 := Match.Groups[6].Value;
end
else
Result :=
nil;
end;
procedure FindGames(
const ATarget: TObjectList<TGame>);
const
cContentsContainer = '
<div id="score-data">';
cHeaderStart = '
<h4>';
cHeaderEnd = '
</h4>';
var
HtmlContents, CurrentCategory, CurrentLine:
string;
Data: TArray<
string>;
CurrentGame: TGame;
i: Integer;
begin
HtmlContents := LoadHtml('
https://m.flashscore.de/?d=0');
HtmlContents := HtmlContents.Substring(HtmlContents.IndexOf(cContentsContainer) + Length(cContentsContainer));
Data := HtmlContents.Split(['
<br />']);
for i := 0
to High(Data)
do
begin
CurrentLine := Data[i];
if CurrentLine.StartsWith(cHeaderStart)
then
begin
CurrentCategory := CurrentLine.Substring(Length(cHeaderStart), CurrentLine.IndexOf(cHeaderEnd));
if CurrentCategory.IndexOf('
<') > 0
then
CurrentCategory := CurrentCategory.Substring(0, CurrentCategory.IndexOf('
<')).Trim;
CurrentLine := CurrentLine.Substring(CurrentLine.IndexOf(cHeaderEnd) + Length(cHeaderEnd));
end;
CurrentGame := ParseGameLine(CurrentLine);
if Assigned(CurrentGame)
then
begin
CurrentGame.Category := CurrentCategory;
ATarget.Add(CurrentGame);
end;
end;
end;
procedure TForm288.Button1Click(Sender: TObject);
var
CurrentGame: TGame;
Games: TObjectList<TGame>;
i: Integer;
begin
Games := TObjectList<TGame>.Create(True);
try
FindGames(Games);
for i := 0
to Games.Count - 1
do
begin
CurrentGame := Games[i];
Memo1.Lines.Add(CurrentGame.Category + sLineBreak
+ '
Start: ' + CurrentGame.StartTime + sLineBreak
+ '
Gegner: ' + CurrentGame.Opponent1 + '
gegen ' + CurrentGame.Opponent2 + sLineBreak
+ '
URL: ' + CurrentGame.URL + sLineBreak
+ '
Ergebnis: ' + CurrentGame.MatchResult1 + '
: ' + CurrentGame.MatchResult2 + sLineBreak + sLineBreak);
end;
finally
Games.Free;
end;
end;