Entwickler-Ecke

Internet / Netzwerk - Text aus homepage auslesen


noobie123 - So 26.10.08 14:26
Titel: Text aus homepage auslesen
hallo,
ich sitze schon 3 std. hier und finde nichts passendes, nicht nur in diesem forum, argh.
Ich möchte gerne etwas aus einer php seite auslesen lassen.


in der php seite steht dies:

Quelltext
1:
<a style="text-decoration: none;" href="/grad/"><span id="grad_celsius">12</span> celsius</a>                    


auf meiner Form habe ich ein Edit feld, in der jetzt nach einem button klick diese 12 grad stehen soll.
dies geht leider nicht:

Delphi-Quelltext
1:
edit1.text:=wb.OleObject.document.forms.item(0).elements.item('grad_celsius').value;                    


in der forensuche bin auch auf "Pos" und so weiter gekommen. ich möchte aber nicht die position ermitteln oder sonstiges sondern einen bestimmt deklarierten text in einer homepage einfach nur bei mir im edit kopieren.


Hidden - So 26.10.08 14:31

Hi,

Du willst einen Teiltext aus einem String extrahieren. Das geht mit den Methoden Suche in der Entwickler-Ecke COPY POS POSEX.

mfG,


whitef - So 26.10.08 15:41

ich habs mal überflogen... weiss ja net ob das das passende ist...
das hatte ich ja auch shcon vorher mit meiner suche gefunden aber dachte nicht dass das was hilft....


Hidden - So 26.10.08 15:50

Hi,

Könntest du demnächst ein paar Zeilen mehr schreiben, wenn etwas unklar ist? Ich muss jetzt nämlich um so mehr im Nebel fischen ;)

Copy('Ich bin ein Text'29) liefert 'ch bin e' - liefert also einen Ausschnitt


Delphi-Quelltext
1:
2:
S := 'Das ; startet den Text';
Copy(S, Pos(';', S), Length(S));
liefert ' startet den Text'.


Delphi-Quelltext
1:
2:
S := 'Das zweite ; startet den Text; hallo, welt';
Copy(S, PosEx(';', S, Pos(';', S) + 1), Length(S));
liefert: ' hallo, welt'.

Diese Methoden sind für die allermeißten Textoperationen ausreichend ;) für 5x PosEx macht man natürlich dann irgendwann eine Schleife ;)

mfG,


whitef - So 26.10.08 16:51

also.... soweit ich weiss, braucht man diesen ansatz um objekte im eigenen browser auszuwählen etc.: "wb.OleObject"

dann müsste man doch nur noch dem obigen oleobject mitteilen was man kopiert haben möchte: <span id="grad_celsius">

das beides zusammen... mh sowas bräuchten wir...


Hidden - So 26.10.08 20:21

Dann mach das doch :gruebel:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
"<span id="grad_celsius">12</span>"

{..}
var
  StrStart: Integer;
const
  StartText = '<span id="grad_celsius">';
  FinText = '</span>';
StrStart := Pos(StartText, S) + Length(StartText);
MyTemperature := StrToInt(Copy(S, StrStart, Length(S) - PosEx(FinText, S, StrStart) - 1));


mfG,


SiegfriedXX - Mo 27.10.08 16:27

Ich möcht nur noch mal klarstellen was die Frage war:

whitef möchte aus einer Internetseite (hier ist es eine .php adresse) den quellcode auslesen.

Innerhalb des Quellcodes benötigt er nun einen Wert und nur dieser ist auch von interesse.


In einem Delphi Programm soll nun also von klicken eines Buttons dieser bestimmte Wert in z.B. ein Editfeld kopiert werden.


was wir wissen ist das die bestimmte quellcodezeile den Zeichenwert: '<a style="text-decoration: none;" href="/grad/"><span id="grad_celsius">12</span> celsius</a>' enthält. Die Zahl 12 soll nun aus dem gestamten Quellcode gefiltert werden.

1. Wie läd man also einen Quellcode ein (bzw. nur einen Teil mit oleobjekt (kenne die funktion nu nicht so))
2. Wie filtert man aus dem Quellcode der in einem String steckt (oder arraystring) den Wert der gesucht ist

das sind die hier gestellten Fragen.

whitef hat schon einen Vorschlag mit oleobjekten gebracht..

Meine Lösung:




Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
unit Unit1;

interface

uses 
   {...} IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP;
   {...} 
type
  {...} 
    IdHTTP1: TIdHTTP;
  {...}


implementation

{...}

procedure TForm1.Button1Click(Sender: TObject);
var
httpcode:string;
begin
httpcode:=IdHTTP1.Get('http://www.google.de');
memo1.Text:=httpcode;
end;

{...}



Das wäre zum Punkt 1 den Quelltext einlesen (Hier wurde einfach ein Memo gewählt in das der quelltext auch dargestellt werden kann). Bitte nicht vergessen den Indy-Clients Componente -> IdHTTP (idHTTP) hinzuzufügen. Im Reiter bei Delphi 7.0 Standart oben unter Indy-Clients zu finden.


Das Filtern müsste nu leichter fallen.. da fragt man einfach den string ab und filtert sich das nu raus.. Beispiele wurden hier ja schon gebracht geht auch auf verschiedenste art..


Hoffe konnte Helfen


noobie123 - Di 28.10.08 20:52

ok habs endlich mal gepackt... hehe



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  //ANGRIFF
  sAngriff := Pos('id=counter1 typ="countdown"', Quelltext) + IntAngriffPlus;
  eAngriff := PosEx('</SPAN></TD></TR>', Quelltext, sAngriff);
  If (sAngriff > 0And (eAngriff > 0Then Begin
  AngriffA.Caption := Copy(Quelltext, sAngriff, eAngriff - sAngriff);
  End;


bloss etwas irrietiert mich bei dem ganzen!

Testweise schick das programm immer n kumpel... und bei dem erscheinen da immer voll der kaudawelch quelltext..., aber ist denk ich mal nur ne defintionssache von Pos & PosEx


Hidden - Di 28.10.08 21:04

Hi,

Ganz schön kriegerischer Quelltext *g* ;)

Pos und PosEx sollten auch auf seinem Rechner laufen :) Was für ein Kaudawelsch bekommt er denn? Einen anderen Teil der Seitenquelltextes, oder.. ?

mfG,


whitef - Di 28.10.08 23:08

lol... jo, zeig mal :D


noobie123 - Di 28.10.08 23:11

ja genau, etwas aus dem quelltext...

bei kommt zb das hier:
Angriff: 12


und bei ihm:
Angriff: META CONTENT<http> usw. halt


kleiner screenshot anbei :D


SiegfriedXX - Mi 29.10.08 18:01

also nicht überall funtkioniert posex

.. daher hier eine variante wie es auch anders funktioniert :D


Fortsetzung des ersten Teils (mit der Variable httpcode als Quellcode Angabe)




Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
//Filterbutton
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
filter1,filter2 :string;
position1,position2 :integer;
begin

filter1:=edit1.Text; // Suchfeld 1 wird in filter1 gespeichert
filter2:=edit2.Text; // Suchfeld 2 wird in filter2 gespeichert
position1 := Length(filter1);     //ermittelt die Länge von Suchfeld 1 und speichert sie in position1 ab
position1 := Pos(filter1, httpcode) +  Length(filter1); // speichert die position des zu suchenden Strings 
                                                        // in position1 + länge des zu suchenden Strings

//schleife beginn
//läuft solange bis Position 2 größer oder gleich position1 ist
//keine gute Lösung da die schleife unendlich laufen kann 
//mögliche variable einbauen die hochgezählt wird und bei 1000 Durchläufen abbricht ..
repeat
position2 := Pos(filter2, httpcode); // ermittelt den Endwert  
until position2 >= position1;
//schleife ende


if position1 <> Length(filter1) then  // Abfrage ob überhaupt eine position1 gefunden wurde
  edit4.Text:= copy(httpcode,position1,position2-position1) //wenn ja wird nun der bestimmte Stringteil rausgefiltert mit copy
else
  edit4.text:='Kein Treffer!'// wenn nichts gefunden wurde wird "Kein Treffer" ausgegeben
end;


Hidden - Mi 29.10.08 20:10

Hi,

Wenn du einen lang genuge Startmarkierung hast, nimm doch einfach Pos ;)

und dann halt statt

Quelltext
1:
2:
Pos('<span id="grad_celsius">', S) 
Pos('<a style="text-decoration: none;" href="/grad/"><span id="grad_celsius">', S)


Eigentlich sollte das obere aber doch ausreichend sein :gruebel: Meine Glaskugel sagt mir, dass ihr euch gesagt habt 'wir nehmen PosEx ab 200 oder so, dann ist das weniger Rechenaufwand'.

Wahrscheinlich kommt das nämlich nichtmehr vor. Dann gibt PosEx 0 zurück und ihr bekommt den Text von Anfang an.

mfG,


SiegfriedXX - Mi 29.10.08 21:51

das problem ist das posex einfach nicht akzeptiert wird bei allen versionen.. jedenfalls funktioniert es in meiner nicht ganz.. aber wo das problem? so wie oben funktionierts außerdem weiß man ja was man filtert..


edit:
es gibt übrigens mehrere möglichkeiten eine filterung durchzuführen.. das mit pos ist nur eine möglichkeit.. dahinter steckt auch mehr ist nur eine stupide funktion

oldschool ist hier immer das beste damit man genau weiß was man macht.. also das array/string mit schleifendurchläufe auf char basierende abfragen.. so wie es pos auch macht..


Hidden - Do 30.10.08 18:18

Aso, es geht um die Delphi-Version :D Ja, PosEx war nicht von Anfang an dabei.


pflo - So 16.11.08 18:50

Hi,
hab n ähnliches problem un hab das jetzt ma so probiert.
das geht auch mit fast allen seiten aba bei youtube streickt IdHTTP.
da kommt die fehlameldung "HTTP/1.1 403 Forbidden."

kann mir jemand helfen??

gruß pflo


toms - So 16.11.08 19:12

Vielleicht liegt's am UserAgent. Probiere mal:

IdHttp1.Request.UserAgent:='Mozilla/4.0'; (oder ähnliches)


pflo - So 16.11.08 19:15

thx jetzt klapts


DesperadoStrike - So 23.11.08 14:55

hallo, kannst du mir nichtmal deinen kompletten quellcode schicken? habe aktuell ein ähnliches problem und weiß nicht so recht weiter. quellcode auslesen usw funktioniert super aber die einzelnen werte rauszufiltern aus den <tr> bekomm ich einfach nicht auf die reihe. posex wird bei mir auch nicht so wirklich erkannt. wär sehr lieb wenn ich mir deinen source mal zu schulungszwecken ansehen dürfte.

mfg patrick


pflo - So 23.11.08 16:49

Hi DesperadoStrike

Bei mir geht das mit dem Posex auch nich, darum hab ich den quelltext in nen 2. string geschrieben, den ich dann imma abschneide.
Der Funktion gibst du den suchbegriff und den gesammt text. Die ausgabe der funktion is dann das ab dem suchbegriff bis zum ". der gesammttext wird abgeschnitten. ich hoffe ich hab mich nich zu verquer ausgedrückt, und ich denke die funktion is selbsterklärend genug.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
               // Suchtext zB =" gesammttext zB asdf="jk"l   aussage: in diesemfall: jk
  function  abschneiden(SubStr:stringvar S:string):string;
  begin
    if pos(SubStr, S)=0 then     //wenn der text nich vorkommt
    begin
      abschneiden:='';
      exit;
    end;
    S:=copy(S, pos(SubStr, S)+length(SubStr), length(S));   //der text wird ab der stelle, wo der Suchtext steht  ( jk"l )
    abschneiden:= copy(S, 0, pos('"', S)-1);               //die ausgabe geht bis vors " ( jk )
  end;