Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TWebbrowser Daten auslesen (https://www.delphipraxis.net/109703-twebbrowser-daten-auslesen.html)

aaron 6. Mär 2008 08:27


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:

Ansehen
Wie bekomme ich die Werte zwischen den Hochkommas ausgelesen, zumal diese Struktur öfters in der HTML-Datei steht?
Wäre suupi wenn mir jemand dabei helfen könnte.

Aaron

marabu 6. Mär 2008 13:30

Re: TWebbrowser Daten auslesen
 
Hallo Aaron,

hier hast du ein wenig Code zum Spielen:

Delphi-Quellcode:
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;
Freundliche Grüße

aaron 6. Mär 2008 18:14

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:
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;
Viele Grüße
Aaron

marabu 6. Mär 2008 18:32

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 MSHTML Referenz.

Freundliche Grüße

capo 7. Mär 2008 00:16

Re: TWebbrowser Daten auslesen
 
Hier funktioniert es auch.

aaron 11. Mär 2008 08:17

Re: TWebbrowser Daten auslesen
 
Soweit klappt das hier nun auch.
Wenn ich aber eine ganze HTML-Datei auslesen will gibt es eine Fehlermeldung.
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EVariantTypeCastError aufgetreten. Meldung: 'Variante des Typs (Null) konnte nicht in Typ (String) konvertiert werden'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------
Liegt das an dieser Zeile?
Delphi-Quellcode:
  e := ec.item(i, null) as IHTMLElement;
Wenn eine hanze HTML-Seite auslesen will dann ist e=nil

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

aaron 13. Mär 2008 00:29

Re: TWebbrowser Daten auslesen
 
Hallo marabu,
könntest du bitte nochmal nachsehen?
Gruss
Aaron

marabu 13. Mär 2008 05:42

Re: TWebbrowser Daten auslesen
 
Moin Aaron,

der Fehler wird vermutlich durch ein fehlendes OnClick-Attribut verursacht. Du kannst das so umgehen:

Delphi-Quellcode:
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;
Freundliche Grüße

aaron 14. Mär 2008 00:05

Re: TWebbrowser Daten auslesen
 
Hallo marabu
nee, das klappt auch nicht.
Zitat:

---------------------------
Fehler
---------------------------
Es ist ein Laufzeitfehler aufgetreten.
Möchten Sie den Debugmodus starten?

Zeile: 69
Fehler: Objekt erwartet
---------------------------
Ja Nein
---------------------------
Freundliche Grüße
Aaron

marabu 14. Mär 2008 06:16

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:38 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz