Delphi-PRAXiS

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

aaron 14. Mär 2008 10:39

Re: TWebbrowser Daten auslesen
 
Ich habe dir wegen den Daten eine PN gesendet.
Gruß
Aaron

marabu 15. Mär 2008 17:26

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

aaron 16. Mär 2008 00:19

Re: TWebbrowser Daten auslesen
 
Vielen vielen Dank.

aaron 18. Mär 2008 15:19

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 20:01 Uhr.

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