AGB  ·  Datenschutz  ·  Impressum  







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

HTML Tabelle einlesen ?

Offene Frage von "cherry"
Ein Thema von pH1L · begonnen am 11. Mär 2007 · letzter Beitrag vom 27. Mai 2008
Antwort Antwort
Seite 1 von 2  1 2      
pH1L

Registriert seit: 25. Jun 2006
11 Beiträge
 
Turbo Delphi für Win32
 
#1

HTML Tabelle einlesen ?

  Alt 11. Mär 2007, 20:05
Hallo,
wie kann ich mit Delphi und den Indys eine HTML Tabelle einlesen (in ein Record-Array, o.ä.) ?
Gibt es vielleicht einen guten (und in der Bedienung einfachen) Parser ?
Hab die Sufu und Google benutzt, bin aber noch auf nichts gestossen, das meinen Anforderungen entspräche

Danke schonmal im Vorraus fürs Antworten, mfg pH1L
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: HTML Tabelle einlesen ?

  Alt 12. Mär 2007, 09:01
Herzlich willkommen in der Delphi-PRAXiS, Phil - auch wenn du schon eine Weile mitliest.

Die Unit MSHTML enthält eigentlich alles was du zum Parsen von HTML-Dokumenten brauchst. So kannst du vorgehen:

(1) Hole das gewünschte HTML-Dokument aus dem Internet.

Delphi-Quellcode:
function GetDocument(const uri: string; var doc: IHTMLDocument2): Boolean;
var
  s: TStream;
begin
  Result := False;
  s := TMemoryStream.Create;
  with TIdHTTP.Create(nil) do
  try
    Get(uri, s);
    Result := LoadDocument(doc, s);
  finally
    Free;
    s.Free;
  end;
end;
(2) Besorge dir die gewünschte Table.

Delphi-Quellcode:
function 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;
(3) Übernehme die Zellen der Tabelle in ein StringGrid.

Delphi-Quellcode:
procedure GetCells(tr: IHTMLTableRow; sg: TStringGrid; 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 GetRows(t: IHTMLTable; sg: TStringGrid);
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;
Das ist der grobe Rahmen, den du verfeinern kannst. Steckt die Tabelle in einem Frame, dann musst du das Dokument des Frames bereitstellen. Dabei hilft dir sicher die Funktion GetFrameDoc. Auch die Funktionen LoadDocument und ProcessMessages findest du hier im Forum. Viel Erfolg.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
pH1L

Registriert seit: 25. Jun 2006
11 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: HTML Tabelle einlesen ?

  Alt 12. Mär 2007, 14:33
Vielen Dank für die umfangreiche Antwort

Eine Frage hätte ich aber noch: Welche Unit benötige ich für
die Funktion "LoadDocument" ?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: HTML Tabelle einlesen ?

  Alt 12. Mär 2007, 14:55
LoadDocument() verlangt die Units MSHTML und ActiveX.

Freundliche Grüße
  Mit Zitat antworten Zitat
pH1L

Registriert seit: 25. Jun 2006
11 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: HTML Tabelle einlesen ?

  Alt 12. Mär 2007, 15:08
Das ging aber schnell
Danke, jetzt lässt sichs kompilieren.
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#6

Re: HTML Tabelle einlesen ?

  Alt 24. Mai 2008, 20:26
hmm ich hab jetzt folgenden Aufruf:

Delphi-Quellcode:
  htmldoc : IHTMLDocument2;
begin

  try
    if GetDocument('http://www.flug-reisecenter.de/online_buchen/buma_lastminute.html', htmldoc) = true then
      showmessage('load successful')
    else
      showmessage('load failed');
  except
    MessageDlg(msg0001,mtWarning,[mbOk],0);
  end;
leider kommt immer die Message "load failed"...
was mach ich falsch?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: HTML Tabelle einlesen ?

  Alt 24. Mai 2008, 21:02
Ein Blick in die Funktion GetDocument() sagt dir, dass LoadDocument() verantwortlich für die Meldung ist. Ein weiterer Blick auf LoadDocument() offenbart, dass FALSE zurückgegeben wird, wenn die Variable htmlDoc noch nicht initialisiert wurde.

Was machst du da gerade? Copy-And-Paste?
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#8

Re: HTML Tabelle einlesen ?

  Alt 25. Mai 2008, 14:59
huch.. hab eben noch nie was mit mshtml gemacht und brauchte dringend was... also bastle ich mir was zusammen... so kann ich das am schnellsten lernen. Und nein c&p stimmt nicht ganz, ich schreibs immer ab damit ichs besser kappiere...
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#9

Re: HTML Tabelle einlesen ?

  Alt 26. Mai 2008, 20:45
habs jetzt stundenlang versucht aber ich kriegs einfach nicht hin... wie gesagt in dem Gebiet bin ich ein Blutiger Anfänger. Deshalb wäre ich um eure Hilfe echt froh.

ich versuch zuerst mal eine einzige zelle auszulesen..
ich habs mal so versucht... aber da krieg ich bei der Funktion "GetCells" eine Zugriffsverletzung, und zwar genau hier: ec := tr.cells;

ich weiss... vermutlich mach ich was ganz fallsch und kappiers von grund auf nicht... deshalb schreib ichs ja hier rein

Delphi-Quellcode:
procedure TForm1.EButton4Click(Sender: TObject);
var
  t: IHTMLTable;
  row: IHTMLTableRow;
  doc: IHTMLDocument2;
begin
  doc := CoHTMLDocument.Create as IHTMLDocument2;
  if GetDocument(Edit1.Text, doc) = true then
  begin
    try
      // holt die erste tabelle
      GetTable(doc,1,t);
    except
      Showmessage('gettable = false');
      exit;
    end;
    begin
      if Assigned(t) = false then
        showmessage('t not assigned');
      //showmessage(t.rows.toString);
      // holt die erste zeile
      row := t.rows.item(1, null) as IHTMLTableRow;
      // sollte die erste zelle holen
      GetCells(row,StringGrid1,1)
    end
  end
  else
    showmessage('getdoc = false');
end;
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: HTML Tabelle einlesen ?

  Alt 26. Mai 2008, 22:22
Hi,

das hast du schon ganz gut gemacht.

Hier noch ein paar Änderungen:

Delphi-Quellcode:
procedure TForm1.EButton4Click(Sender: TObject);
var
  t: IHTMLTable;
  row: IHTMLTableRow;
  doc: IHTMLDocument2;
begin
  doc := CoHTMLDocument.Create as IHTMLDocument2;
  if GetDocument(Edit1.Text, doc) then
  begin
    if GetTable(doc, 0, t) then // first Table
    begin
      row := t.rows.item(0, null) as IHTMLTableRow; // first Row
      if Assigned(row)
        then GetCells(row, StringGrid1, 0) // StringGrid.Row = 0
        else ShowMessage('no rows found');
    end else ShowMessage('no tables found')
  end else ShowMessage('GetDocument failed');
end;
Der letzte Parameter von GetCells() gibt die Row im StringGrid an, in der die Zellen einer Tabellenzeile abgelegt werden sollen.

Getippt und nicht getestet.

Gute Nacht
  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 12:14 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