Internet Tools

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
BeniBela
Beiträge: 308
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Internet Tools

Beitrag von BeniBela »

Scheint als habe ich hier noch gar nicht auf meine Internet Tools hingewiesen.

Sie implementieren alles was man für das Abfragen von Webseiten braucht:

  • HTTP-Klassen, welche die System nativen Funktionen zum Runterladen verwenden: Wininet unter Windows, Apache HTTPComponents unter Android, und Synapse überall sonst. Automatisch kümmern sich Weiterleitungen/Cookies/https.
  • HTML-Parser, um die Seite vor zu verarbeiten
  • XQuery / XPath 2 / JSONiq / CSS-Selektor-Interpreter, um die benötigten Werte mit einer vernünftigen (an xml/html angepassten und Turing-vollständigen) Programmiersprache auszulesen
  • Templates für Pattern-Matching auf der Seite.

Beispiel, um die Hostnamen aller Links auf einer Seite aufzulisten:

Code: Alles auswählen

 
uses simpleinternet;
var temp: IXQValue;
begin
  for temp in process('http://google.de',
                      'distinct-values(//a/extract(@href, "http://([^/]*)/", 1))') do
    writeln(temp.toString);
end.
 

BeniBela
Beiträge: 308
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Internet Tools

Beitrag von BeniBela »

Seit einiger Weile unterstützt es auch XPath/XQuery 3.0.

Und ab jetzt gibt es ein funktionales query/map/filter interface, mit dem man beliebige Berechnungen verketten kann.

Zum Beispiel kann man das obige Beispiel folgendermaßen ersetzen:

Code: Alles auswählen

 
uses xquery, synapseinternetaccess;
var temp: IXQValue;
begin
  for temp in xqvalue('http://google.de')
              .retrieve()
              .map('//a')
              .map('extract(@href, "http://([^/]*)/", 1)')
              .query('distinct-values($_)') do
    writeln(temp.toString);
end.
 


Oder man belässt es bei einem Funktions-Aufruf:

Code: Alles auswählen

 
uses xquery, synapseinternetaccess;
var temp: IXQValue;
begin
  for temp in query('distinct-values(doc("http://google.de")//a/extract(@href, "http://([^/]*)/", 1))') do
    writeln(temp.toString);
end.
 




Oder, wenn man eine Liste von Zahlen in einem String hat, alle ungeraden entfernen will, und die Summe der drei kleinsten Zahlen berechnen will, kann man es so tun:


Code: Alles auswählen

 
  uses xquery;
  xqvalue('1 43 112 31 14 124 12 10 129')
    .query('tokenize($_, " ")')
    .map('number()')
    .filter('. mod 2 = 0')
    .order()
    .filter('position() <= 3')
    .query('sum($_)')
    .toString()
 


und bekommt 36.

Natürlich kann man das auch in einer Zeile mit query machen, aber mit der Verkettung kann man Zwischenergebnisse speichern, wenn man sie braucht.

Antworten