Italian community of Lazarus and Free Pascal

Programmazione => Lazarus e il web => Topic aperto da: AndreaM - Giugno 20, 2016, 07:54:20 am

Titolo: Analisi HTML con Internettools
Inserito da: AndreaM - Giugno 20, 2016, 07:54:20 am
Buongiorno,
Sto tentando di capire il funzionamento di alcune funzioni per analizzare una pagina HTML utilizzando internettools.
Nella pagina http://wiki.freepascal.org/Internet_Tools (http://wiki.freepascal.org/Internet_Tools) è presente un esempio che ricava tutti i link href interni alla pagina utilizzando la funzione:
Codice: [Seleziona]
uses simpleinternet;
...
var link: IXQValue;
...
for link in process('http://www.sito.it', '//a/@href') do
  writeln(link.toString);
La funzione viene chiamata tante volte quanti sono i link incontrati e poi stampati con writeln... e questa funziona correttamente!
Io vorrei fare la stessa cosa per ricavare il contenuto all'interno di un tag <div id="myth"> ... </div> e quindi metto:
Codice: [Seleziona]
...
for link in process('http://www.sito.it','<div id="myth">{.}') do
...
La funzione mi restituisce solo la prima occorrenza trovata, anche se all'interno del documento HTML sono presenti più tag <div id="myth"> ... </div>.
Sicuramente non ho capito come scrivere la query in process, ad esempio non so come usare "//" o "/" o "@".
Qualcuno può spiegarmi come scrivere correttamente la query e quali caratteri usare al suo interno, o dove visualizzare una guida abbastanza dettagliata?
Grazie
AndreaM.
Titolo: Re:Analisi HTML con Internettools
Inserito da: xinyiman - Giugno 20, 2016, 08:35:54 am
Allega un esempio e ti diamo volentieri una mano!
Titolo: Re:Analisi HTML con Internettools
Inserito da: AndreaM - Giugno 20, 2016, 09:47:15 am
Ecco un esempio:
Codice: [Seleziona]
procedure TForm1.Button3Click(Sender: TObject);
var link: IXQValue;
    dwn:string;
    i:integer;
begin
memo.Lines.Clear;
// recupero la pagina HTML
dwn := retrieve('http://dizionario-italiano.it/dizionario-italiano.php?lemma=acqua');
//strSaveToFileUTF8('test.html',dwn); // salvo il contenuto
i:=0;
for link in process(dwn,'<div id="myth">{.}') do
  begin
  inc(i);
  memo.Lines.Add(IntToStr(i)+'-------------------------------------------');
  memo.Lines.Add(link.toString);
  end;
end;
al click del bottone recupero la pagina del dizionario e dovrei ottenere che il ciclo for si ripete per 3 volte, perchè dentro la pagina ci sono tre tag <div id='myth">, ma effettivamante mi fa vedere solo il contenuto del primo!
Titolo: Re:Analisi HTML con Internettools
Inserito da: Legolas - Giugno 20, 2016, 05:02:11 pm
Prova questo template:

Codice: [Seleziona]
<div id="myth">{.}</div>*

dovrebbe funzionare... :)
Titolo: Re:Analisi HTML con Internettools
Inserito da: AndreaM - Giugno 21, 2016, 05:44:41 am
Grazie, perfetto, funziona!
Ma dove posso reperire informazioni più dettagliate su come scrivere e usare i template?
Titolo: Re:Analisi HTML con Internettools
Inserito da: Legolas - Giugno 21, 2016, 01:40:03 pm
Qui:

http://www.videlibri.de/cgi-bin/xidelcgi

In basso nella pagina trovi della documentazione