Avatar billede klipklipklap Nybegynder
06. august 2004 - 14:41 Der er 3 kommentarer og
1 løsning

Web / HTML parser

Hejsa,

Er der nogen som har en stump kode der kan:

Browse ind på en side og tage en specifik del ud af siden (noget tekst).

Jeg ved på forhånd hvordan 90% af siden er sat op (altså HTML mæssigt). De resterende 10% er tekst indsat fra php/mysql. Det er denne tekst jeg skal have hentet/udtrukket. Koden skal derfor kunne indentificeret et bestemt punkt (tegn) og først trække ud derfra.

Lidt kringlet ja, men det skulle nu godt kunne lade sig gøre.

Rgs
Kliperen!
Avatar billede cautoo Nybegynder
06. august 2004 - 14:47 #1
Jeg lavede engang noget lignende, ud fra en kode jeg fandt her på siden...
min unitkode ser sådan her ud:
(Indsæt følgende objekter på en form først:
TButton TClientSocket TLabel TEdit TLabel)
(Dobbeltklik på elementerne så fælgende procedure bliver oprettet
    procedure Button1Click(Sender: TObject);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ClientSocket1Disconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocket1Write(Sender: TObject;
      Socket: TCustomWinSocket);
)


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ClientSocket1: TClientSocket;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ClientSocket1Disconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocket1Write(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure PostTheForm;
  private
    { Private declarations }
    HTTP_POST  : String;
    FContent    : String;
    FResult    : String;   
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Const
  WebServer = 'www.msnemoticons.nl';
  WebPort  = 80;
  PostAddr  = '/webmasters/blockchecker/';

  HTTP_Data =
    'Content-Type: application/x-www-form-urlencoded'#10+
    'User-Agent: Delphi ()'#10+
    'Host: www.msnemoticons.nl'#10+
    'Connection: Keep-Alive'#10;

function HTTPTran(St : String) : String;
var i : Integer;
begin
  Result:='';
  for i:=1 to length(St) do
    if St[i] in ['a'..'z','A'..'Z','0','1'..'9'] then
      Result:=Result+St[i]
    else if St[i]=' ' then
      Result:=Result+'+'
    else
      Result:=Result+'%'+IntToHex(Byte(St[i]),2);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.caption := '';
  PostTheForm;
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  ErrorCode := 0;
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  i: Integer;
begin
  // DET ER HER DU SKAL LAVE DIN STRING BEHANLING, FRESULT INDEHOLDER HTMLKODEN.
  // DENNE KODE BRUGER EN MSN BLOCKTJEKKER PÅ NETTET, TIL AT TJEKKE OM BRUGER ER ONLINE

  i := pos('<img src="', FResult);
  FResult := copy(FResult, i, length(FResult));
  i := pos('>', FResult);
  FResult := copy(FResult, 0, i);
  if pos('offline', FResult) > 0 then
  Label1.caption := 'Brugeren er offline'
  else
  Label1.caption := 'Brugeren er online'
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  FResult:=FResult+Socket.ReceiveText;
end;

procedure TForm1.ClientSocket1Write(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Socket.SendText(HTTP_POST+FContent);
end;

procedure TForm1.PostTheForm;
begin
  FResult:='';

  FContent:=
  'back=' + HTTPTran('nee') + '&' +
  'submitBlock=' + HTTPTran('Check') + '&' +
  'email=' + HTTPTran(edit1.text) + '&'+
  'B1=Submit'+#10;

  FContent := 'Content-Length: '+IntToStr(Length(FContent))+#10+#10+FContent;

  ClientSocket1.Host := WebServer;
  ClientSocket1.Port := WebPort;
  HTTP_POST := 'POST '+PostAddr+' HTTP/1.0'#10;
  HTTP_Post := HTTP_Post + HTTP_Data;
  ClientSocket1.Open;
end;

end.
Avatar billede cautoo Nybegynder
06. august 2004 - 14:49 #2
Men du kan også bruge delphis indbyggede HTTP komponenter... ovenstående kode er mest beregnet til, hvis man skal sene nogle formvariabler med sig.
Avatar billede cautoo Nybegynder
06. august 2004 - 14:50 #3
med delphi er en demo, der viser hvordan man kan få udskrevet HTML koden, fra en alm. side
Avatar billede nico26 Nybegynder
07. august 2004 - 17:52 #4
yep, du kan bruge TNMHTTP - det er ret nemt...

NMHTTP1.Get('http://www.dinside.dk');
Memo1.Text := NMHTTP1.Body;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester