Entwickler-Ecke
Internet / Netzwerk - Problem mit dem Auslesen von IDs aus einer Html datei
CABALxx - Mi 25.01.06 22:35
Titel: Problem mit dem Auslesen von IDs aus einer Html datei
Also ich bins mal wieder und hab ein Problem.
Situation ist folgende: ich will einen Bot schreiben. Er soll mir bei einem kleinen Internetgame zur hand gehen. Es gibt eine seite, da kann man Entwicklungen tätigen, per Buttonklick.
Mein kleiner Helfer soll nun kontrollieren ob schon eine Entwicklung läuft ( in diesem falle kann keine weitere gestartet werden ). Das ist kein Problem.
Er hat weiterhin eine Liste von Entwicklungen die er nach einander durchgehen soll, und als allererstes mal feststellen muss, ist die Entwicklung denn überhaupt verfügbar. Auch das ist kein Problem.
Das große Problem ist folgendes: Um eine Entwicklung zu starten, wird im normalfalle ein Button gedrückt.
Im Quelltext sieht das so aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| <tr> <td height="28" align="center" width="25%" class="MainText"> Basic Warfare</td> <td height="28" valign="middle" width="55%" class="MainText"> Research into the basic fundamentals of warfare in space.<br> <b>Composite: 4000, Energy: 500,</b><br> <i>4 Hours Research</i> </td> <td height="28" valign="middle" align="center" width="20%" class="MainText"> <a href="research.aspx?ItemID=1"><img src="Btn_Start.gif" width="70" height="23" border="0"></a> </td> </tr> |
So ich hab versucht das Problem so zu lösen, das ich mit Pos und Copy den teil mit
?ItemID=.... rausgeschnitten habe und an die URL gehängt habe. Dadurch kann man diesem Submiteffekt ebenfalls erreichen. Hat auch ganz gut geklappt, für die erste Entwicklung. Nur scheinbar sind die Zeichenanzahlen, Zeilenlängen usw. im Quelltext so verschieden bei den verschiedenen Entwicklungen, das sich das nicht veralgemeinern lies.
Hier mein Code:
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: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
| procedure TForm1.Timer6Timer(Sender: TObject); var p, i : integer; nores, researchcode, s, b, e, item : string; Techtree : array of string; begin
nores := 'no research'; researchcode := Memo1.Text; i := 0;
SetLength(techtree, 50); techtree[1] := 'electrical integrity'; techtree[2] := 'basic extraction'; techtree[3] := 'basic warfare'; techtree[4] := 'field absorption'; techtree[5] := 'adv. mining'; techtree[6] := 'adv. generation'; techtree[7] := 'wave arrays'; techtree[8] := 'energy lancing'; techtree[9] := 'applied physics'; techtree[10] := 'improved hulls'; techtree[11] := 'warp technology'; techtree[12] := 'adv. hulls'; techtree[13] := 'hull fields'; techtree[14] := 'spatial barrages'; techtree[15] := 'flanking manoeuvres'; techtree[16] := 'heat shielded armour'; techtree[17] := 'structure shattering'; techtree[18] := 'electronic shielding';
repeat i := i +1; item := techtree[i]; until pos(item, researchcode) > 0;
if Pos(nores, researchcode) > 0 = true then begin s := Memo1.Text; p := pos(item, s ) + 200; b := copy(s, p, 78); p := pos('href', b)+19; e := copy(b, p, MaxInt); p := pos('"><img', e); s := copy(e, 1, p-1); Memo2.Text:= s;
WebBrowser1.Navigate('http://www.starsphere.net/game/research.aspx' + s); end else Memo2.Text := 'no research nicht gefunden';
end; |
Für das erste Item in dem Array klappt das ausgezeichnet, aber für alle anderen sind die Werte für die Zeichen also, z.B. + 200, oder Copy in der Länge 78 Zeichen, total verschieden und funktionieren nicht mehr.
Gibt es vielleicht eine Bessere Lösung???
Danke schonmal für eure Hilfe
CABALxx - So 29.01.06 17:26
hmm ich habs nochmal versucht bisschen zu ändern, aber es hat nicht geklappt.
Ich wüsste jetzt auch keine andere möglichkeit.
Wenn einer eine Idee hat, ich bin für jeden Rat dankbar
Lannes - So 29.01.06 18:10
Hallo,
kannst Du denn nicht direkt mit dem Webbrowser oder über MSHTML auf das Document-Object-Modell auf href=... zugreifen?
Es ist auch möglich auf innerText der <td>-HTML-Elemente zuzugreifen. :arrow:
so [
http://www.delphipraxis.net/post490608.html#490608]
Gehts eventuell so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var s : String; begin s := Memo1.Text; Delete(s,1,Pos('Basic Warfare',s)); Delete(s,1,Pos('research.aspx?ItemID=',s)+Length('research.aspx?ItemID=')-1); s := Copy(s,1,Pos('"',s)-1); showmessage('http://www.starsphere.net/game/research.aspx?ItemID='+s); |
Sonst hänge doch mal den kompletten Quelltext der Seite hier an,
dann kann man eventuell besser etwas dazu sagen.
CABALxx - So 29.01.06 21:57
Hallo
Vielen dank schonmal
ich werde beide methoden mal ausprobieren.
Ich wusste garnicht das es Delete gibt .
Danke danke ich meld mich wieder
BenBE - So 29.01.06 22:11
Eine weitere Möglichkeit, das Problem anzugehen, ist die Nutzung von "regulären Ausdrücken", auch wenn man dazu zusatz-Units benötigt.
Mit solch einer Unit würdest Du dann nur noch nach
(Achtung: PHP-RegExp-Syntax)
#"http://www.starsphere.net/game/research.aspx?ItemID=([0-9a-zA-Z]+)"#ism
suchen und würdest ein Array mit den IDs zurückbekommen. Leider gibt's für Delphi kaum brauchbare Units, die an die RegExps von PHP auch nur annähernd rankommen (aber es gibt sie, such mal bei Torry).
Auf die Art kann man (mit etwas Fummelei) sogar komplette Revisions-Logs bei SourceForge mit einem Befehl auslesen (Selber schon erfolgreich gemacht, allerdings war der RegExp ETWAS* länger ) ;-)
* Im Endeffekt 3 Bildschirm-Zeilen, bei ~280 Zeichen Länge und 6 Matching und weiteren 8 Non-Matching-Klammern. Zwischenzeitlich hab ich sogar PHP zum Abstürzen bekommen.
CABALxx - Di 31.01.06 18:51
Ui
das scheint mir eine sehr komplizierte Methode zu sein. Und ich muss sagen ich hab leider keine Ahnung von PHP
ich werd erstmal die andere Methode probieren und mich wieder melden, sobald ich mal Zeit finde.
Danke aber trotzdem, vielleicht brauch ichs ja dennoch, wenn die andren Methoden versagen.
:wink:
bis dann
:D
Horst_H - Di 31.01.06 19:16
Hallo,
ich hatte mal etwas quick and dirty gepinselt.
Eine Htmldatei wird eingelesen und dann alles nach 'href=' usw. in dem memofeld gespeichert.
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: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118:
| unit HrefFinden;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private S : string; public end;
var Form1: TForm1;
implementation
{$R *.dfm} uses strutils;
procedure TagFolgerSuchen(tag:string;var s:string;var outstrL :TStringlist); var i,von,bis,ltag :integer; Kopie : string; begin outstrL.clear; Kopie := s; Kopie:= uppercase(Kopie); tag := uppercase(tag); for i := 1 to length(Kopie) do If Kopie[i] in[#0..#31,'<','>'] then Kopie[i] := #32; ltag := length(tag); von := 1; if length(Kopie)>lTag then repeat von := PosEx(tag,Kopie,von); if von = 0 then break; von := von+ltag; if von >ltag then if Kopie[von-ltag-1]=' ' then begin case Kopie[von] of #34 : begin inc(von); bis := PosEx('"',Kopie,von)-1; end; #39 : begin inc(von); bis := PosEx(#39,Kopie,von)-1; end else bis := PosEx(' ',Kopie,von)-1; end; if bis >0 then begin outstrL.Add(copy(s,von,bis-von+1)); von := bis+1; end; end; until false; end;
procedure TForm1.Button1Click(Sender: TObject); const trenner='******************************************************************'; var strL :TStringLIst; begin strL := TSTringList.Create; StrL.LoadFromFile('c:\T-online.de.html'); s := strL.Text; memo1.Clear;
Memo1.Lines.Add(trenner);Memo1.Lines.Add('Href');Memo1.Lines.Add(trenner); TagFolgerSuchen('href=',s,StrL); memo1.Lines.AddStrings(strl);
Memo1.Lines.Add(trenner);Memo1.Lines.Add('Titel');Memo1.Lines.Add(trenner); TagFolgerSuchen('title=',s,StrL); memo1.Lines.AddStrings(strl);
Memo1.Lines.Add(trenner);Memo1.Lines.Add('Name');Memo1.Lines.Add(trenner); TagFolgerSuchen('name=',s,StrL); memo1.Lines.AddStrings(strl);
Memo1.Lines.Add(trenner);Memo1.Lines.Add('Werte');Memo1.Lines.Add(trenner); TagFolgerSuchen('value=',s,StrL); memo1.Lines.AddStrings(strl);
Memo1.Lines.Add(trenner);Memo1.Lines.Add('ID''s');Memo1.Lines.Add(trenner); TagFolgerSuchen('iD=',s,StrL); memo1.Lines.AddStrings(strl);
Memo1.Lines.Add(trenner);Memo1.Lines.Add('Anker');Memo1.Lines.Add(trenner); TagFolgerSuchen('a ',s,StrL); memo1.Lines.AddStrings(strl);
strL.Free; end;
end. |
Gruss Horst
CABALxx - Mi 01.02.06 18:06
Hallo
Vielen Dank für den Code. Ich werd den mal Probieren
das wäre natürlich das Optimum wenn der so funktionieren würde.
Ich werds mal Probieren.
Aber rein des Verständnisses her:
Was genau bedeutet denn das:
???
Weil Kopie ist doch String und I integer und ich kenne diese Darstellungsform eignetlich nur von Arrays oder Lists.?
Vielen dank :D
Horst_H - Mi 01.02.06 18:40
Hallo,
das ist ja das Angenehme, dass man einen String als array[1..lenght(string)] of char auffassen darf.
Es geht darum alle Steuerzeichen,usw zu einem Blank =' '= chr(32)=#32 umzuwandeln.
Damit wird als Trenner zweier Worte immer ein ' ' gefunden.
'<td>' wird zu ' td 'usw.
Na hoffentlich ist es auch das, was Du suchst.
Gruss Horst
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!