Questi giorni, sto cercando di ottimizzare il codice dello spider attuale per creare uno spider sull'idea di Osvi.
Effettuando una programmazione modulare, questo pomeriggio ho sviluppato un PARSER html in php cercando di crearne uno più veloce dell'attuale.
Il codice del parser è questo:
function parser_html($html)
{
$len = strlen($html);
$tag['title'] = '';
$tag['h1'] = '';
$tag['body'] = '';
$tag['links'] = array();
for($i = 0 ; $i < $len ; $i++ )
{
if($tag['title']=='' && substr($html,$i,strlen('<title>')) == '<title>')
$tag['title'] = substr($html,$i+strlen('<title>'),strpos(substr($html,$i+strlen('<title>')-1),'</title>')-1);
if($tag['h1']=='' && substr($html,$i,strlen('<h1>')) == '<h1>')
$tag['h1'] = substr($html,$i+strlen('<h1>'),strpos(substr($html,$i+strlen('<h1>')-1),'</title>')-1);
if($tag['body']=='' && substr($html,$i,strlen('<body>')) == '<body>')
$tag['body'] = substr($html,$i+strlen('<body>'),strpos(substr($html,$i+strlen('<h1>')-1),'</body>')-1);
if(substr($html,$i,strlen('<a')) == '<a')
{
$html_rimanente = substr($html,$i);
$href = substr($html_rimanente,strpos($html_rimanente,"href"),strpos($html_rimanente,">")-strpos($html_rimanente,"href"));
$href = str_replace(" ","",$href);
$href = substr($href,strpos($href,"\"")+1,strpos(substr($href,strpos($href,"\"")+1),"\""));
if(substr($href,0,6)!='mailto')
$tag['links'][] = $href;
}
}
$tag['title'] = ereg_replace("[[:punct:]]"," ",$tag['title']); //pulisco dalla punteggiatura
$tag['title'] = str_replace("\n", " ",$tag['title']);
$tag['title'] = trim(preg_replace("/[ \t]{2,}/"," ",$tag['title'])); //sostituisco gli spazi contigui e le tabulazioni con un solo spazio
$tag['h1'] = strip_tags($tag['h1']); //tolgo i tag dalla pagina
$tag['h1'] = ereg_replace("[[:punct:]]"," ",$tag['h1']); //pulisco dalla punteggiatura
$tag['h1'] = str_replace("\n", " ",$tag['h1']);
$tag['h1'] = trim(preg_replace("/[ \t]{2,}/"," ",$tag['h1'])); //sostituisco gli spazi contigui e le tabulazioni con un solo spazio
$tag['body'] = preg_replace("'<script[^>]*?>.*?</script>'si","",$tag['body']); //tolgo eventuale javascript
$tag['body'] = preg_replace("/<h1>(.+?)<\/h1>/si","",$tag['body']); //tolgo gli h1 per non contare 2 volte l'occorrenza dei suoi termini
$tag['body'] = strip_tags($tag['body']); //tolgo i tag dalla pagina
$tag['body'] = ereg_replace("[[:punct:]]"," ",$tag['body']); //pulisco dalla punteggiatura
$tag['body'] = str_replace("\n", " ",$tag['body']);
$tag['body'] = trim(preg_replace("/[ \t]{2,}/"," ",$tag['body'])); //sostituisco gli spazi contigui e le tabulazioni con un solo spazio
return $tag;
}
Il parser prende come parametro il codice html e resituisce una matrice così strutturata:
matrice[0] = testo del titolo
matrice[1] = testo di h1
matrice[2] = testo di body (senza nessun tag html)
matrice[3] = elenco di links trovati nel codice
scusate l'assenza di commenti e la scarsa identazione del codice.
Io chiedo a voi membri di creare dei parser html scritti con una funzione simile a quella scritta da me (magari modificando proprio quella mia ) e di postarli in questo 3d.
Dopo che avrò ricevuto tutti i parser, farò un benchmark delle prestazioni in termini di tempo di esecuzione e il più rapido sarà utilizzato nello spider di Teecno che sto sviluppando.
Buon lavoro.