AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Tabelle aus HTML auslesen

Ein Thema von Captnemo · begonnen am 26. Okt 2012 · letzter Beitrag vom 23. Aug 2016
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

Tabelle aus HTML auslesen

  Alt 26. Okt 2012, 06:17
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.)
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Tabelle aus HTML auslesen

  Alt 26. Okt 2012, 06:35
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)
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#3

AW: Tabelle aus HTML auslesen

  Alt 26. Okt 2012, 06:42
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo

Geändert von Captnemo (26. Okt 2012 um 06:46 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

AW: Tabelle aus HTML auslesen

  Alt 26. Okt 2012, 07:45
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.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

AW: Tabelle aus HTML auslesen

  Alt 26. Okt 2012, 07:49
@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?
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#6

AW: Tabelle aus HTML auslesen

  Alt 26. Okt 2012, 07:57
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: Tabelle aus HTML auslesen

  Alt 26. Okt 2012, 08:06
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.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#8

AW: Tabelle aus HTML auslesen

  Alt 26. Okt 2012, 10:06
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;
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Tabelle aus HTML auslesen

  Alt 26. Okt 2012, 13:49
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#10

AW: Tabelle aus HTML auslesen

  Alt 29. Okt 2012, 08:01
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?
Miniaturansicht angehängter Grafiken
htmlseite.jpg  
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:39 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