Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Webseiten werte anhand von ID auslesen und ausgeben (https://www.delphipraxis.net/169592-webseiten-werte-anhand-von-id-auslesen-und-ausgeben.html)

mamble 30. Jul 2012 20:58

Webseiten werte anhand von ID auslesen und ausgeben
 
Ich habe hier eine simple Webseite.

Code:
<html>
   <head>
      <title>Daten</title>
   </head>
   <body>
   
   <p id="Person1">Hanni</p>
   
   <p id="Person2">Karl</p>
   
   <p id="Dio">4</p>
   
   </body>
</html>

Mit einer einfachen Applikation möchte ich nun die 3 Werte "Hanni", "Karl" und "4" in meine drei Delphi variablen, "PERSON1", "PERSON2" und "DIO" schreiben.

Mit TWebbrowser könnte ich es realisieren, aber visuell möchte ich das nicht haben.

Es geht darum darum die Daten mit möglichst wenig Zeilen Code in die Applikation zu holen.

Ich würd' ja gern die Indy benutzen, aber mit Idhttp.get, Copy und Pos bekomm ich das nicht hin.
Die Werte auf der Seite ändern sich ab und an und dann ist die Länge der Namen immer unterschiedlich... gibt es eine simple Möglichkeit den Inhalt anhand der ID zu erfassen?

Valle 30. Jul 2012 21:03

AW: Webseiten werte anhand von ID auslesen und ausgeben
 
Da gibt es eine Menge Möglichkeiten. Recht schnell und einfach ist ein Regulärer Ausdruck (Regular Expressions, Regex), zumindest wenn man damit schon mal gearbeitet hat. Eine weitaus schönere Methode wäre ein DOM-Parser. Das funktioniert aber nur bei korrektem HTML-Code. Mit TWebBrowser hast du auch eine art DOM-Parser (glaube ich). Soweit ich weiß kann man den auch unsichtbar machen. Du kannst aber auch, wenn du willst, mit Copy und Pos arbeiten. Das ist aber oft etwas wackelig, vor allem ewnn sich der Inhalt der Webseite verändert. Der Trick ist es, nach dem "</p>" zu suchen.

Liebe Grüße,
Vlaentin

mamble 30. Jul 2012 21:20

AW: Webseiten werte anhand von ID auslesen und ausgeben
 
Vielen dank für deine schnelle Antwort. :)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
id: string;
begin
id:= Idhttp1.Get('data.php');
id:= copy (id, pos('Person1', id)+9, Length(id));
id:= copy (id, 1, pos('</p>', id)-1);
edit1.Text := id;
end;
Hier erhalte ich wenn ich nach Person1 und Person2 im Code suche die beiden Namen, aber bei Dio leider nicht, da andere Länge.

Hast du ein Beispiel für die Regex? Ich blick da nicht ganz durch.

Valle 30. Jul 2012 22:04

AW: Webseiten werte anhand von ID auslesen und ausgeben
 
Naja, dann schreibst du für Dio eben 5 statt 9 da rein. Oder gleich Length('Dio">').

Zur Regex: Ich kann dir auf Delphi-Seite leider nicht helfen. Ohne zu testen hätte ich es mal so probiert:

Code:
/<p id="(.*)">(.*)</p>/
Wichtig: Die Suche muss non-greedy sein. Sie liefert alle vorhanden <p>-Tags mit ID und Inhalt.

Liebe Grüße,
Valentin

omata 30. Jul 2012 22:37

AW: Webseiten werte anhand von ID auslesen und ausgeben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal etwas konkreter...

Thom 30. Jul 2012 23:13

AW: Webseiten werte anhand von ID auslesen und ausgeben
 
Es geht auch relativ einfach über eine TXMLDocument-Komponente. Die Funktion XMLDocument.DOMDocument.GetElementById() wird leider von MSXML nicht unterstützt, so daß man selbst nach der ID suchen muß. Der Aufwand hält sich aber in Grenzen und ist im Gegensatz zu den RegEx-Lösungen wesentlich flexibler:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  n: Integer;
  ID, Tag: IDOMNode;
  Tags: IDOMNodeList;
begin
  XMLDocument1.XML.Text:=
    '<html>'+
    ' <head>'+
    '   <title>Daten</title>'+
    ' </head>'+
    ' <body>'+
    '   <p id="Person1">Hanni</p>'+
    '   <p id="Person2">Karl</p>'+
    '   <p id="Dio">4</p>'+
    ' </body>'+
    '</html>';
  XMLDocument1.Active:=true;
  Tags:=XMLDocument1.DOMDocument.GetElementsByTagName('*');
  for n:=0 to Tags.Length-1 do
  begin
    Tag:=Tags.Item[n];
    ID:=Tag.Attributes.GetNamedItem('id');
    if Assigned(ID)
      then ShowMessage(Format('%s: %s',[ID.NodeValue,Tag.FirstChild.NodeValue]));
  end;
end;

mamble 31. Jul 2012 16:10

AW: Webseiten werte anhand von ID auslesen und ausgeben
 
Danke für alle Antworten.

@omata: Das Beispiel war perfekt. Ich habe Match[2] je Durchgang in eine Stringlist geschrieben und diese dann nachher den einzelnen Variablen zugewiesen.

Übrigens könnte ich das Format auch anders machen so wie <Person1>Hanni</Person1> oder Person1:Hanni , die einzige Vorraussetzung ist das die Datei eine PHP Datei ist, da die Daten durch GET vorher eingegrenzt werden und dann aus der DB geholt werden.
Am Besten wäre ein Format und eine Methode die möglichst wenig Traffic verursacht.




Das letzte Problem das ich habe ist eine Alternative für die Indy's unter FIREMONKEY - iOS zu finden, die funktionieren anscheinend nur unter Mac/PC.

Jetzt kann ich die Webseite garnicht erst durch idHttp1.get anfordern. Gibt es da für FIREMONKEY - iOS eine einfach Alternative?

sx2008 1. Aug 2012 07:43

AW: Webseiten werte anhand von ID auslesen und ausgeben
 
Zitat:

Zitat von Valle (Beitrag 1176365)
Du kannst aber auch, wenn du willst, mit Copy und Pos arbeiten. Das ist aber oft etwas wackelig...

Das nennt man dann murksen.
Das ist ungefähr so als wenn man bei einem Auto das Getriebe nur mit einer Wasserpumpenzange bewaffnet wechseln möchte.
Auch die Verwendung von RegEx zum Parsen von HTML ist Gemurkse:
http://www.codinghorror.com/blog/200...hulhu-way.html
Es ist nicht verboten zu murksen, aber man sollte halt wissen, dass der Code prinzipiell unstabil ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:59 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