Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Tabelle aus HTML auslesen (https://www.delphipraxis.net/171215-tabelle-aus-html-auslesen.html)

Captnemo 26. Okt 2012 06:17

Tabelle aus HTML auslesen
 
Hi ich will eine Tabelle aus eine HTML-Seite übernehmen.
Der User muß vorab über eine EmbeddedWB-Komponente navigieren und dann soll per Button die dargestellte Tabelle übernommen werden.

Hier mal mein Code, den ich unter zur Hilfenahme von http://www.delphipraxis.net/88200-ht...-einlesen.html mir so zusammengeschrieben habe.

Delphi-Quellcode:
function Tfrm_kasys_datenabruf.GetDocument(var doc: IHTMLDocument2): Boolean;
begin
  Result:=False;
  Try
    doc:=embeddedWB1.Doc2 as IHTMLDocument2;
    Result:=True;
  Except
    Result:=False;
  End;
end;

function Tfrm_kasys_datenabruf.GetTable(doc: IHTMLDocument2; v: OleVariant; var t: IHTMLTable): Boolean;
var
  ec: IHTMLElementCollection;
  e2: IHTMLElement2;
begin
  Result:=True;
  e2 := doc.body as IHTMLElement2;
  ec:=e2.getElementsByTagName('table');
  if ec.length>0 then
    t:=ec.item(v, null) as IHTMLTable else
    Result:=False;
end;

procedure Tfrm_kasys_datenabruf.GetCells(tr: IHTMLTableRow; sg: TAdvStringGrid; index: Integer);
var
  i: Integer;
  ec: IHTMLElementCollection;
  e: IHTMLElement;
  s: TStrings;
begin
  s:=sg.Rows[index];
  s.Clear;
  ec:=tr.cells;
  if sg.ColCount<ec.length then
    sg.ColCount:=ec.length;
  for i := 0 to Pred(ec.length) do begin
    e:=ec.item(i, null) as IHTMLElement;
    s.Add(e.innerText);
  end;
end;

procedure Tfrm_kasys_datenabruf.GetRows(t: IHTMLTable; sg: TAdvStringGrid);
var
  i: Integer;
  ec: IHTMLElementCollection;
begin
  ec:=t.rows;
  sg.RowCount:=ec.length;
  for i := 0 to Pred(ec.length) do
    GetCells(ec.item(i, null) as IHTMLTableRow, sg, i);
end;
Und hier meine Procedure vom Button:
Delphi-Quellcode:
procedure Tfrm_kasys_datenabruf.LeseDocumentTable;
var
  doc: IHTMLDocument2;
  t: IHTMLTable;
  row: IHTMLTableRow;
begin
  Doc := CoHTMLDocument.Create as IHTMLDocument2;
  if GetDocument(doc) then begin
    if GetTable(doc, 0, t) then begin
      row:=t.rows.item(0, null) as IHTMLTableRow;
      if Assigned(row) then
        GetCells(row, sg_abruf, 0) else
        ShowMessage('Keine Zeilen gefunden');
    end else
      ShowMessage('Keine Tabelle gefunden');
  end else
    ShowMessage('Keine Document erhalten');
end;
Ich bekomme immer die Meldung 'Keine Tabelle gefunden', das letztlich heißt, dass die Function GetTable halt nix findet.
Jetzt würde ich gerne den Inhalt von e2 bzw. ec mal im Debugger anzeigen lassen. Sind aber Pointer und ich kann lediglich die Adresse sehen.

Wie kann ich mir den Inhalt anzeigen lassen, auf den die Pointer zeigen?

(Wenn jemand natürlich sieht, wo mein Fehler liegt, dann hab ich auch nichts dagegen.)

mkinzler 26. Okt 2012 06:35

AW: Tabelle aus HTML auslesen
 
Es ist aber eine (HTML-)Tabelle im Dokument enthalten? Moderne Systeme verwenden ja zunehmenst immer weniger originäre HTML-Tags und ersetzen alles durch JS erzeugte Konstrukte ( Selbst Links und Bilder werden oft so eingebunden)

Captnemo 26. Okt 2012 06:42

AW: Tabelle aus HTML auslesen
 
Guten Morgen ;-)

Hast recht. Mist. Hab mir grad, auf deinen Hinweis hin, den HTML-Code nochmal angeschaut. Da ist tatsächlich eine table in einer table, wobei nur die innere die Daten enthält.
(Ich darf leider die Seite hier nicht posten. Ich müßte erst sämtliche Daten verfremden.)

Aber er schein ja schon die erste Tabelle nicht zu finden.

Popov 26. Okt 2012 07:45

AW: Tabelle aus HTML auslesen
 
Zitat:

Zitat von mkinzler (Beitrag 1188437)
Es ist aber eine (HTML-)Tabelle im Dokument enthalten? Moderne Systeme verwenden ja zunehmenst immer weniger originäre HTML-Tags und ersetzen alles durch JS erzeugte Konstrukte ( Selbst Links und Bilder werden oft so eingebunden)

Meinst du mir JS JavaScript? Ich kenne das auch mit css.

Popov 26. Okt 2012 07:49

AW: Tabelle aus HTML auslesen
 
@Captnemo

Wobei, aber da weiß ich nicht wie man das lösen kann, ist eine über den Browser kopierte Tabelle eine Tabgetrennte CSV-Tabelle. Und es ist ja nichts leichter als eine CSV-Tabelle einzulesen.

Oder muß es über den Quellcode der Html-Seite sein?

Captnemo 26. Okt 2012 07:57

AW: Tabelle aus HTML auslesen
 
Die Tabelle ist im Document schon mit den herkömlichen Tags <table>...</table> realisiert. Java/CSS wird nur für das Menü und ein paar Darstellungen verwendet.

Natürlich würde das ggf. auch über copy/paste gehen. Finde ich aber nicht so glücklich, weil ich dann ja immer aufpassen muß, was denn der Anwender mit seiner Maus noch so alles markiert und mit kopiert hat.

Nein, das sollte schon direkt im Quellcode gehen.
Ich kann natürlich auch einfach den Quellcode nehmen, alles rausschmeißen, was ich nicht brauche, die table isolieren und dann das ganze direkt auslesen. Aber ich dachte mir wenn es mit MSHTML besser geht, wäre das ja eleganter.
Nur habe ich damit noch so gar keine Erfahrungen.

Und wie in meinem ersten Post bereits geschrieben, wäre es toll und hilfreich, wenn ich innerhalb der Procedure/Functionen mir die Variablen ansehen könnte. Aber weil das alles nur Pointer sind, weiß ich nicht, wie ich an die dahinter liegenden Daten rankomme.

Popov 26. Okt 2012 08:06

AW: Tabelle aus HTML auslesen
 
An für sich ist es nicht so schwer, auch den HTML Code parsen. Ich weiß, dass ich das mindestens schon ein mal ümgesetzt habe, vielleicht sogar als Beispiel hier irgendwo, oder DelphiForum. Demnach müßte es schon hier irgendwo rumliegen. Ich suche mal.

Popov 26. Okt 2012 10:06

AW: Tabelle aus HTML auslesen
 
Ich hab Just4Fun einen Parser programmiert. Memo1 enthält den ganzen Html-Code, es wird die erste gefundene Tabelle bearbeitet, Ergebnis steht im Memo2. Zwei Probleme gibt es noch: es wird nur nach kleingeschriebenen Tags gesucht, hier muß es noch so umgeschrieben werden, dass Groß-/Kleinschriebung nicht beachtet wird. Dann müssen noch die Umlaute (M&uuml;nchen für München) konvertiert werden.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

  function MyPos(Substr: string; S: string): Integer;
  begin
    Result := Pos(Substr, S);
  end;

  function ExtractTagArea(var HtmlCode: String; Tag: String): String;
  var
    p: Integer;
  begin
    Result := HtmlCode;
    p := MyPos('<' + Tag, Result);
    if p > 0 then Delete(Result, 1, p);
    p := MyPos('>', Result);
    if p > 0 then Delete(Result, 1, p);
    p := MyPos('</' + Tag + '>', Result);
    if p > 0 then
    begin
      HtmlCode := Copy(Result, p + Length('</' + Tag + '>'), MaxInt);
      Delete(Result, p, MaxInt);
    end;
  end;

  function TrLineToCsvLine(TrLine, Tag: String): String;
  var
    sTd: String;
  begin
    Result := '';
    while MyPos('<' + Tag, TrLine) > 0 do
    begin
      sTd := ExtractTagArea(TrLine, Tag);
      Result := Result + sTd;
      if MyPos('<' + Tag, TrLine) > 0 then Result := Result + #9;
    end;
  end;

var
  sTmp, sTabelle, sTr: String;
  sl: TStringList;
  s: String;
begin
  sl := TStringList.Create;
  try
    sTmp := Memo1.Lines.Text;
    sTabelle := ExtractTagArea(sTmp, 'table');

    while MyPos('<tr', sTabelle) > 0 do
    begin
      sTr := ExtractTagArea(sTabelle, 'tr');

      s := TrLineToCsvLine(sTr, 'th');
      if Length(s) = 0 then
        s := TrLineToCsvLine(sTr, 'td');

      sl.Add(s);
    end;

    Memo2.Lines.Text := sl.Text;
  finally
    sl.Free;
  end;
end;

p80286 26. Okt 2012 13:49

AW: Tabelle aus HTML auslesen
 
Zitat:

Zitat von Captnemo (Beitrag 1188448)
Und wie in meinem ersten Post bereits geschrieben, wäre es toll und hilfreich, wenn ich innerhalb der Procedure/Functionen mir die Variablen ansehen könnte. Aber weil das alles nur Pointer sind, weiß ich nicht, wie ich an die dahinter liegenden Daten rankomme.

Wo ist da das problem?
a) Du hast
Delphi-Quellcode:
type
  tmyarray : array [0..2] of byte;
var
  poptr= ^myarray;
mit poptr^ werden im Debugger 3 Byte angezeigt.

b) Du hast einen "nackten" Pointer
Delphi-Quellcode:
type
  tmyarray : array [0..2] of byte;
var
  poptr= pointer;
dann erhälst Du mit myarray(poptr^)[0] das erste Byte von der Adresse auf die der Pointer zeigt, und mit integer(poptr^) den wert der gleichen Speicheradresse als Integer.
Das Funktioniert natürlich auch mit anderen Typen.

Gruß
K-H

Captnemo 29. Okt 2012 08:01

AW: Tabelle aus HTML auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Komme leider mit den Beispielen nicht weiter. Der Grund wird sein, dass die Seite aus der ich die Daten auslesen muß Frames verwendet. Das wäre ja nicht so schlimm, denn es gibt ja einige Beispiele, die beschreiben wie man den Inhalt der Frameset ausliest.
Nur blöderweise verwendet die Webseite verschachtelte Framesets. Und ich komme da einfach nicht ran. Bei allen Möglichkeiten, die ich ausprobiert habe, komme ich immer nur zum ersten Frameset, aber nicht an die in der Tiefe.
Als Anlage mal ein Bild, wenn ich im Internetexplorer mir das mit den Entwicklertools anzeigen lassen.

Kann mir jemand helfen, wie ich da ran komme?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 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