![]() |
TWebbrowser Daten auslesen
Ich muss Daten aus einer HTML-Datei auslesen die mehrfach in dieser Datei vorkommen und würde die Daten gerne über ein Stringgrid gleich nach Excel verfrachten, was das kleinere Problem darstellt.
Die Struktur der Daten liegen in folgendem Format vor: Zitat:
Wäre suupi wenn mir jemand dabei helfen könnte. Aaron |
Re: TWebbrowser Daten auslesen
Hallo Aaron,
hier hast du ein wenig Code zum Spielen:
Delphi-Quellcode:
Freundliche Grüße
uses
Mshtml; function CreateDocument(const markup: string): IHTMLDocument2; var doc: OleVariant; begin Result := CoHTMLDocument.Create as IHTMLDocument2; doc := Result; doc.Open; doc.Write(markup); doc.Close; end; procedure ShowIt(doc: IHTMLDocument2; s: TStrings); const MARKER = 'showit('; var i, iLeft, iRight: Integer; ec: IHTMLElementCollection; e: IHTMLElement; value: string; begin ec := doc.all.tags('a') as IHTMLElementCollection; for i := 0 to Pred(ec.length) do begin e := ec.item(i, null) as IHTMLElement; value := e.getAttribute('onclick', 0); iLeft := Pos(marker, Lowercase(value)) + Length(marker); iRight := LastDelimiter(')', value); if iLeft > Length(marker) then value := Copy(value, iLeft, iRight- iLeft) else value := ''; s.QuoteChar := ''''; s.DelimitedText := value; end; end; procedure TDemoForm.ButtonClick(Sender: TObject); var doc: IHTMLDocument2; markup: TStrings; begin markup := TStringList.Create; try markup.LoadFromFile(ParamStr(1)); // oder LoadFromStream doc := CreateDocument(markup.Text); ShowIt(doc, markup); ShowMessage(markup.Text); finally markup.Free; end; end; |
Re: TWebbrowser Daten auslesen
Hallo Marabu,
danke für dein Beispiel, magst du mir evtl. ein paar Kommentare dazuschreiben? Insbesondere zu diesem Teil:
Delphi-Quellcode:
Viele Grüße
procedure ShowIt(doc: IHTMLDocument2; s: TStrings);
const MARKER = 'showit('; var i, iLeft, iRight: Integer; ec: IHTMLElementCollection; e: IHTMLElement; value: string; begin ec := doc.all.tags('a') as IHTMLElementCollection; for i := 0 to Pred(ec.length) do begin e := ec.item(i, null) as IHTMLElement; value := e.getAttribute('onclick', 0); iLeft := Pos(marker, Lowercase(value)) + Length(marker); iRight := LastDelimiter(')', value); if iLeft > Length(marker) then value := Copy(value, iLeft, iRight- iLeft) else value := ''; s.QuoteChar := ''''; s.DelimitedText := value; end; end; Aaron |
Re: TWebbrowser Daten auslesen
Hallo Aaron,
was genau an dieser Prozedur verstehst du nicht? Die IHTML-Schnittstellen stammen aus der Unit MSHTML, dokumentiert sind sie in der ![]() Freundliche Grüße |
Re: TWebbrowser Daten auslesen
Hier funktioniert es auch.
|
Re: TWebbrowser Daten auslesen
Soweit klappt das hier nun auch.
Wenn ich aber eine ganze HTML-Datei auslesen will gibt es eine Fehlermeldung. Zitat:
Delphi-Quellcode:
Wenn eine hanze HTML-Seite auslesen will dann ist e=nil
e := ec.item(i, null) as IHTMLElement;
Und nochwas- Wenn ich nur die Daten ohne Html in einer Datei stehen habe wird immer nur der letzte Datensatz der Datei angezeigt. Gruß Aaron |
Re: TWebbrowser Daten auslesen
Hallo marabu,
könntest du bitte nochmal nachsehen? Gruss Aaron |
Re: TWebbrowser Daten auslesen
Moin Aaron,
der Fehler wird vermutlich durch ein fehlendes OnClick-Attribut verursacht. Du kannst das so umgehen:
Delphi-Quellcode:
Freundliche Grüße
procedure ShowIt(doc: IHTMLDocument2; s: TStrings);
const MARKER = 'showit('; var i, iLeft, iRight: Integer; ec: IHTMLElementCollection; e: IHTMLElement; value: string; begin ec := doc.all.tags('a') as IHTMLElementCollection; for i := 0 to Pred(ec.length) do begin e := ec.item(i, null) as IHTMLElement; value := VarToStr(e.getAttribute('onclick', 0)); // deal with null value if value = '' then Continue; // skip when JS missing iLeft := Pos(marker, Lowercase(value)) + Length(marker); iRight := LastDelimiter(')', value); if iLeft > Length(marker) then value := Copy(value, iLeft, iRight- iLeft) else value := ''; s.QuoteChar := ''''; s.DelimitedText := value; end; end; |
Re: TWebbrowser Daten auslesen
Hallo marabu
nee, das klappt auch nicht. Zitat:
Aaron |
Re: TWebbrowser Daten auslesen
Moin Aaron,
wenn du mir ein Testdokument gibst, dann kann ich dir weiterhelfen. Momentan weiß ich weder wie dein HTML-Dokument noch wie dein Quelltext aussieht - geschweige denn, was du in Zeile 69 machst. Freundliche Grüße |
Re: TWebbrowser Daten auslesen
Ich habe dir wegen den Daten eine PN gesendet.
Gruß Aaron |
Re: TWebbrowser Daten auslesen
Hallo Aaron,
ich habe mir die Webseite angesehen und mein Code-Beispiel etwas angepasst. Es sind character entities enthalten und manche Feldwerte enthalten markup code.
Delphi-Quellcode:
Freundliche Grüße
function CreateDocument(const markup: string): IHTMLDocument2;
var doc: OleVariant; begin Result := CoHTMLDocument.Create as IHTMLDocument2; doc := Result; doc.Open; doc.Write(markup); doc.Close; end; function DecodeEntities(const s: string): string; var doc: OleVariant; begin doc := CoHTMLDocument.Create; doc.open; doc.Write(s); doc.Close; Result := doc.body.innerHtml; end; procedure ShowIt(doc: IHTMLDocument2; s: TStrings); const MARKER = 'showinfoalphabet('; var i, iLeft, iRight: Integer; ec: IHTMLElementCollection; e: IHTMLElement; value: string; begin ec := doc.all.tags('a') as IHTMLElementCollection; for i := 0 to Pred(ec.length) do begin e := ec.item(i, null) as IHTMLElement; value := VarToStr(e.getAttribute('onclick', 0)); if value = '' then Continue else value := DecodeEntities(value); iLeft := Pos(marker, Lowercase(value)) + Length(marker); iRight := LastDelimiter(')', value); if iLeft > Length(marker) then value := Copy(value, iLeft, iRight- iLeft) else Continue; s.Add(value); end; end; // Test procedure TDemoForm.ButtonClick(Sender: TObject); var doc: IHTMLDocument2; csv, markup: TStrings; fn: string; begin fn := 'C:\Daten\DP\A.htm'; markup := TStringList.Create; csv := TStringList.Create; try markup.LoadFromFile(fn); doc := CreateDocument(markup.Text); ShowIt(doc, csv); csv.SaveToFile(ChangeFileExt(fn, '.csv')); finally markup.Free; csv.Free; end; end; |
Re: TWebbrowser Daten auslesen
Vielen vielen Dank.
|
Re: TWebbrowser Daten auslesen
Hallo Achim,
darf ich dich in dieser Angelegenheit nochmal um einen Gefallen bitten? Auf den übrigen Seiten wird nicht mehr mit HTML Entities gearbeitet, ich bekomme zwar mit deinem allerersten Code immer eine Adresse angezeigt aber nie alle. Wenn ich showinfoalphabet in showInfo bei deinem allerletzten Code ändere bringt das auch nichts. Irgendwie hatte ich vorgestern Ergebnisse bekommen, nun versuche ich schon seit Stunden etwas brauchbares zustande zu bringen, leider ohne Erfolg. Man sollte doch immer alles speichern. Habe dir nochmal eine PN geschickt. [EDIT] Stimmt du hattest recht, ich hatte einen Schreibfehler Gruß Aaron |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:32 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