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:
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:
...
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.
Ecco un esempio:
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!
Prova questo template:
<div id="myth">{.}</div>*
dovrebbe funzionare... :)