![]() |
AW: Text einer Internetseite in Memo einlesen
Zitat:
Ich bringe es mal auf den Punkt: Ich will den Text dieser ![]() |
AW: Text einer Internetseite in Memo einlesen
Stimmt, mein Fehler. :oops:
Man braucht eine Datei mit dem gesamten HTML Dokument. Der Download der Webadresse ist nicht enthalten. Inwieweit die Indys plattformübergreifend funktionieren, weiss ich leider nicht. Damit hatte ich schon Downloads gemacht. |
AW: Text einer Internetseite in Memo einlesen
Zitat:
Zitat:
Also kannst du einfach TNetHTTPClient.Get verwenden: ![]() |
AW: Text einer Internetseite in Memo einlesen
Zitat:
|
AW: Text einer Internetseite in Memo einlesen
Wenn ich
Delphi-Quellcode:
starte bekomme ich Html, ausschnittsweise...
Memo4.text:= NetHTTPClient1.get('https://m.flashscore.de/?d=0').ContentAsString;
Code:
Kopiere ich gleichzeitig den von mir gewünschten Text der Seite, erhalte ich ausschnittsweise...
<!DOCTYPE html>
<html lang="de"> <head> <meta charset="utf-8"> <title>Livescore Mobile - Fussball auf Flashscore.de Mobil</title> <meta name="description" content="Verfolge die akttuellen fussball Ergebnisse wenn du unterwegs bist mit der für Mobilgeräte optimierten Version von Flashscore.de."> <meta name="copyright" content="Copyright (c) 2006-2025 Livesport s.r.o."> <meta name="robots" content="noindex,nofollow" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta property="og:title" content="Livescore Mobile - Fussball auf Flashscore.de Mobil"> <meta property="og:description" content="Verfolge die akttuellen fussball Ergebnisse wenn du unterwegs bist mit der für Mobilgeräte optimierten Version von Flashscore.de."> <meta property="og:type" content="website"> <meta property="og:url" content="http://www.flashscore.de/?d=0"> <meta property="og:image" content="https://m.flashscore.de/"> <link rel="shortcut icon" href="https://static.flashscore.com/res/_fs/image/4_favicons/_fs/favicon.ico?v=8"> <link rel="apple-touch-icon" sizes="180x180" href="https://static.flashscore.com/res/_fs/image/4_favicons/_mobi/touch-icon-180x180.png?v=8"> <link rel="icon" type="image/png" sizes="32x32" href="https://static.flashscore.com/res/_fs/image/4_favicons/_mobi/favicon-32x32.png?v=8"> <link rel="icon" type="image/png" sizes="16x16" href="https://static.flashscore.com/res/_fs/image/4_favicons/_mobi/favicon-16x16.png?v=8"> <link rel="manifest" href="/manifest/1/?v=7"> <meta name="theme-color" content="#001e28"> <link rel="stylesheet" href="https://static.flashscore.com/x/css/layout_304_1433000000.css"> <link rel="stylesheet" href="https://static.flashscore.com/res/styles/container.304.css"> <link rel="stylesheet" href="https://static.flashscore.com/res/styles/container.0.css"> <script type="text/javascript" defer src="https://static.flashscore.com/res/_fs/build-mobi/programaticStrip.ba5d2c6.js"></script> <script type="text/javascript" src="https://static.flashscore.com/res/_fs/build-mobi/mobiRuntime.2d4cf7d.js"></script> <script type="text/javascript" src="https://static.flashscore.com/res/_fs/build-mobi/autorefresh.0b1d793.js"></script> <script type="text/javascript"> // <![CDATA[ // ]]> </script> </head> <body class="m.Flashscore.de mobi brand--flashscore"> <div id="top"></div><div class="logo"><a href="/"><img src="https://static.flashscore.com/res/_mobi/image/logo/flashscore.png?v=2" alt="m.Flashscore.de" /></a></div> <div id="main" class="soccer"> <p class="p-set menu"><a href="/" class="active">Fussball</a> | <a href="/eishockey/">Eishockey</a> | <a href="/tennis/">Tennis</a> | <a href="/basketball/">Basketball</a> | <a href="/handball/">Handball</a> | <a href="/volleyball/">Volleyball</a> | <a href="/baseball/">Baseball</a> | <a href="/football/">Am. Football</a> | <a href="/rugby/">Rugby</a> | <a href="/andere-sportarten/">Mehr »</a></p><p class="p-set menu"> ...
Code:
Fussball | Eishockey | Tennis | Basketball | Handball | Volleyball | Baseball | Am. Football | Rugby | Mehr »
Heute | Gestern | Morgen | Weitere Tage » Alle Spiele | LIVE | Beendete | Quoten Auto-refresh (30s) | EINSCHALTEN | JETZT AKTUALISIEREN Fussball » Heute » Alle Spiele Sportwetten jetzt auch von Ihrem Mobiltelefon aus. Mit bet365! AFRIKA: Weltmeisterschaft - Qualifikation Tabelle 15:00AbgesagtKongo - Sambia -:- 15:00AbgesagtNiger - Eritrea -:- 17:00Togo - Mauretanien 2:2 20:00Sudan - Senegal 0:0 EUROPA: Weltmeisterschaft - Qualifikation Tabelle 15:00Liechtenstein - Nordmazedonien 0:3 18:00Moldawien - Norwegen 0:5 18:00Montenegro - Gibraltar 3:1 88'Israel - Estland 2:1 90+'Tschechien - Färöer Inseln 2:1 90'Wales - Kasachstan 2:1 SÜDAMERIKA: Weltmeisterschaft - Qualifikation Tabelle 00:30Uruguay - Argentinien 0:1 ÄGYPTEN: Division 2 A Tabelle 20:30Abu Qir Semad - Al-Sekka 0:0 90+'Aswan SC - WE SC 1:0 90+'Dayrout - Asyut Petroleum 0:2 Warten auf UpdatesEl Mansoura - Alexandria SC 1:0 90+'La Viena - Kahrabaa Ismailia 0:2 87'Proxy - Arab Contractors 0:2 90+'Suez SC - Baladiyat El Mahalla 0:1 90+'Tanta - Tersana 1:0 90+'Wadi Degla - Al Qanah 2:1 ... |
AW: Text einer Internetseite in Memo einlesen
Zum Parsen der Seite kannst du Christians Klasse verwenden. Oder du nimmst einfach Regular Expressions, denn das Format ist ja sehr überschaubar.
Wenn du aus dem Browser markierst und kopierst, bekommst du ja nur den Text. Das ist zwar für einen Menschen gut lesbar, aber um es verarbeiten zu können, fehlen alle Elementdefinitionen. Darum kann man damit zum Verarbeiten wenig anfangen. Da musst du ja wissen, wo ein Element anfängt und wo es endet. |
AW: Text einer Internetseite in Memo einlesen
Zitat:
|
AW: Text einer Internetseite in Memo einlesen
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm..
Ich habe mal zum Test einfach mit D6 und dessem TWebBrowser (Ja, der URALT IE)! den Link geöffnet und dann dessen Text in ein Memo geholt. (Siehe ScreenShot.jpg)
Delphi-Quellcode:
Auch wenn MS den IE nicht mehr weiter entwickelt, kann es noch im aktuellen W11 verwendet werden.
procedure TForm1.Button1Click(Sender: TObject);
begin WebBrowser1.Silent := True; // Script-Fehlemeldunngen unterdrücken WebBrowser1.Navigate(Edit1.Text); // Warten das Browser fertig while not(WebBrowser1.ReadyState = READYSTATE_COMPLETE) do Application.ProcessMessages; // Text aus IE holen Memo1.Lines.Text := WebBrowser1.OleObject.Document.Body.InnerText // nur der Text; end; Eigentlich müsste dies doch im neuen Delphi und dem TEgeBrowser genau so gehen? Optional könnte das auch im Hintergrund mit der MSHTML gemacht werden, hab ich nur noch nicht ausprobiert. Diese soll lt. MS auch noch weiterhin in Windows verbleiben, selbst wenn der IE entfernt wird... |
AW: Text einer Internetseite in Memo einlesen
Zitat:
Ich würde dir sehr raten, auf den umständlichen Weg über den Webbrowser und das umständliche Auswerten des reinen Textes zu verzichten und den Download der Seite und den direkten Zugriff auf die Elemente zu nutzen. Aber dein Weg ist sehr einfach, was das Auslesen des Textes angeht, nur eben mit viel Overhead: In Javascript bekommst du das mit document.body.innerText, das du oben ja schon verwendet hast. Das kannst du dann mit EvaluateJavaScript auswerten, musst das dann aber auch zurückgeben und nicht in eine Variable schreiben. Du kannst das auch direkt bekommen, aber das ist relativ umständlich und funktioniert dann nur unter Android, deshalb zeige ich lieber einen einfachen Weg, auch wenn der nicht optimal ist. Beispiel:
Delphi-Quellcode:
procedure TForm287.Button1Click(Sender: TObject);
begin WebBrowser1.Navigate('https://www.with-is-bad.de'); end; procedure TForm287.Button2Click(Sender: TObject); begin WebBrowser1.EvaluateJavaScript('document.location = "source://" + encodeURIComponent(document.documentElement.outerHTML);'); end; procedure TForm287.WebBrowser1ShouldStartLoadWithRequest(ASender: TObject; const URL: string); begin if URL.StartsWith('source://') then begin ShowMessage(TNetEncoding.URL.Decode(URL.Substring(9))); WebBrowser1.Stop; end; end; Zitat:
|
AW: Text einer Internetseite in Memo einlesen
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal ein komplettes Beispiel ohne Browser und ohne Parserklasse, einfach nur Strings und eine Regular Expression. Die Kategorie könnte man natürlich auch im RegEx direkt mit auswerten, aber so ist es vielleicht einfacher zu verstehen.
Du brauchst nur einen Button und ein Memo:
Delphi-Quellcode:
Ergebnis:
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; Anhang 57450 Solltest du das nicht nur privat selbst nutzen, brauchst du natürlich auch die Genehmigung des Seiteninhabers, dass du die Daten nutzen darfst! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz