+ Rispondi alla Discussione
Risultati da 1 a 20 di 20

il parser html più veloce

Ultimo Messaggio di 4ustat il:
  1. #1
    User
    Data Registrazione
    Oct 2006
    Messaggi
    11

    il parser html più veloce

    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:

    Codice:
    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.

  2. #2
    User L'avatar di phakko
    Data Registrazione
    Jun 2006
    Località
    Roma
    Messaggi
    64
    allora io ho sviluppato un parser xml (che può essere adattato anche ad html) con xmldom (sia x php4 che php5!) è più efficiente su php4 poichè xmldom è supportato mentre x php5 ho utilizzato un port. il sistema consente l'accesso diretto ai tag, quindi rispetto al tuo substr è più gestibile.
    se volete vi posto i listati.
    Fabio Cicerchia - COORDINATORE TEECNO

  3. #3
    User
    Data Registrazione
    Oct 2006
    Messaggi
    11
    posta posta, purchè rispecchi il modello della funzione ke ho fatto io.. prende l'html come parametro e restituisce la matrice con title, h1, body e lista dei links. Se puoi già adattarlo tu sotto questa forma è bene, m risparmi del lavoro altrimenti lo riadatto io. ciao e grazie

  4. #4
    L'avatar di Giorgiotave
    Data Registrazione
    Oct 2004
    Località
    Monasterace
    Messaggi
    40,156
    Visita il canale Youtube di Giorgiotave
    Ottimo, posta pure Fabio

    Ottimo anche ^woznihack^

    Giorgio Taverniti Blog. FastForward: su YouTube ogni Martedì!

    Tutta la SEO in 23 ore: 9 diversi moduli tematici, 34 lezioni, questo è il Videocorso SEO del 2017!


  5. #5
    User
    Data Registrazione
    Nov 2006
    Località
    Napoli
    Messaggi
    68

    Spider

    Salve, sono nuovo su questo forum, mi sono iscritto qualche giorno fa e sono molto interessato a questo progetto..
    Secondo le mie idee e quelle di phakko sarebbe meglio creare un spider che si divide in due file..

    Primo file del spider esplora soltanto il web, cioè passando un link quest'ultimo esaminando tutta la pagina e facendo il parser del html mi restituisce tutti i links contenenti nella pagina.. che poi vengono slavati nel database, alla fine del parser si ricarica la pagina e pesca dal database un altro link da esaminare.. e così a ciclo un tot di numeri che si vuole parsare di pagine alla volta, si potrebbe mettere questo file nel CronTab soltanto di notte per non rallentare il server di giorno..

    La seconda pagina invece pesca i link già esaminati dalla prima pagina del spider e recupera le keywords secondo l'algortmo attuale (Tf*IDF) ecc....

    In questo modo si ha un spider molto più veloce, almeno credo...

    Fatemi sapere cosa ne pensate, cmq se questa idea è ottima ho quasi pronta la prima pagina del spider con diversi controlli sui links, eliminazione di links doppi ecc.... Invece la seconda pagina sarà molto simile al codice scritto in spider attuale...

    Cosa ne pensate?

  6. #6
    User
    Data Registrazione
    Nov 2006
    Località
    Napoli
    Messaggi
    68

    Terza pagina del spider

    Si potrebbe creare anche una terza pagina dello spider che esamina ogni tanto i links che sono già stati controllati in precedenza per vedere se ci sono delle modifiche...

  7. #7
    L'avatar di Giorgiotave
    Data Registrazione
    Oct 2004
    Località
    Monasterace
    Messaggi
    40,156
    Visita il canale Youtube di Giorgiotave
    Ciao Andriy,

    benvenuto nel Forum gt e grazie per voler partecipare a questo progetto

    secondo me è possibile farlo questo spider anche come dici tu

    Facci vedere va
    Giorgio Taverniti Blog. FastForward: su YouTube ogni Martedì!

    Tutta la SEO in 23 ore: 9 diversi moduli tematici, 34 lezioni, questo è il Videocorso SEO del 2017!


  8. #8
    Esperto L'avatar di domenico biancardi
    Data Registrazione
    Aug 2006
    Messaggi
    547
    scusate ma per recuperare il title di una pagina non è meglio utilizzare una regular expression?
    <title>(.+)</title>

  9. #9
    Esperto L'avatar di domenico biancardi
    Data Registrazione
    Aug 2006
    Messaggi
    547
    ho letto per bene il codice dello spider, e si usano le regular expression, molto bene

    mi piace molto come è stato progettato. volevo sapere se avete adottato qualche strategia information retrieval all'interno della ricerca.

  10. #10
    Esperto L'avatar di Everfluxx
    Data Registrazione
    Jun 2006
    Località
    Subpadania
    Messaggi
    1,257
    Un consiglio: usatele il meno possibile, le funzioni di PHP basate su espressioni regolari. Sono molto più lente di str_replace() e str_ireplace().

    Una domanda (alla quale prima o poi vi troverete a dover rispondere): come vi comportate con una pagina priva di tag <title>? Eheheh.

  11. #11
    Esperto L'avatar di domenico biancardi
    Data Registrazione
    Aug 2006
    Messaggi
    547
    Citazione Originariamente Scritto da Everfluxx
    Un consiglio: usatele il meno possibile, le funzioni di PHP basate su espressioni regolari. Sono molto più lente di str_replace() e str_ireplace().
    dove l'hai appresa questa cosa? posso farvi qualche pagina di test, ho i miei seri dubbi su questa affermazione

  12. #12
    Esperto L'avatar di Everfluxx
    Data Registrazione
    Jun 2006
    Località
    Subpadania
    Messaggi
    1,257
    Citazione Originariamente Scritto da domenico.biancardi
    dove l'hai appresa questa cosa? posso farvi qualche pagina di test, ho i miei seri dubbi su questa affermazione
    E' cosa risaputa (mi pare ci sia anche un tip a riguardo nel manuale di PHP)...
    Comunque, se non ti fidi della mia affermazione, ti basta una semplice ricerca su Google per verificarla.

  13. #13
    Esperto L'avatar di domenico biancardi
    Data Registrazione
    Aug 2006
    Messaggi
    547
    no no questione di affezioniamento verso le regular expression. fare operazioni complesse in una istruzione è sempre molto bello, magari a scapito della velocità.

    sta di fatto che per certe regex dovresti utilizzare 5-6 istruzioni di str_replace

    non so dovrei fare dei test rimango dubbioso

  14. #14
    User
    Data Registrazione
    Oct 2006
    Messaggi
    228
    Per le funzioni di parsing perché non vi appogiate al Perl: è dannatamente efficiente nella loro manipolazione...

  15. #15
    User
    Data Registrazione
    Sep 2005
    Messaggi
    451
    Io ho un consiglio da darvi in base alla mia esperienza, calcolando che ho spiderizzato qualche milione di pagina web spero che vi possa essere utile.

    Fate enorme attenzione agli errori del codice html, non sembra ma incasinano di brutto.

    Sembra una boiata come consiglio, ma vi accorgerete che è un problema enorme!

  16. #16
    User
    Data Registrazione
    Oct 2006
    Messaggi
    228
    Quoto UMOR. La funzione parser_html da per scontate parecchie cose come ad esempio che la pagina sia conforme ad un DDT. Inoltre, non limitatevi a controllate la sola intestazione HTTP per capire se si tratti o meno di HTML (i campi HTTP HEADER sono manipolabili), ma affidatevi ad analisi spot.

    ... Colgo la palla la balzo per suggerirvi una chicca: sottoporre le pagine ad un validatore come quello del validator.w3.org.

  17. #17
    User
    Data Registrazione
    Oct 2006
    Messaggi
    228
    Tratto da: http://infolab.stanford.edu/~backrub/google.html

    Parsing -- Any parser which is designed to run on the entire Web must handle a huge array of possible errors. These range from typos in HTML tags to kilobytes of zeros in the middle of a tag, non-ASCII characters, HTML tags nested hundreds deep, and a great variety of other errors that challenge anyone's imagination to come up with equally creative ones.

  18. #18
    Esperto
    Data Registrazione
    Oct 2006
    Messaggi
    336
    Ciao, una curiosità: l'output che deve dare la funzione e che serve a teecno è ancora quello iniziale?

    Cosa fare nel caso ci siano due h1, si considera il secondo dato che dovrebbe essere più specifico?

  19. #19
    User
    Data Registrazione
    Oct 2006
    Messaggi
    228
    Citazione Originariamente Scritto da Fra_T
    Cosa fare nel caso ci siano due h1, si considera il secondo dato che dovrebbe essere più specifico?
    Infatti, lo sviluppo dei parser html è una area di ricerca molto interessante ma anche estremamente complessa. Io mi affiderei in questo caso alla stessa scelta dei motori di ricerca più importanti: mozilla. La piattaforma offre una serie di tool fantastici per l'analisi dei contenuti html attraverso l'interfaccia DOM standardizzata. Ciao

  20. #20
    User L'avatar di 4ustat
    Data Registrazione
    Feb 2007
    Messaggi
    94
    per quanto riguarda la gestione degli errori, proporrei la vecchia teoria delle iptable di linux (scusate se la prendo alla lunga ) ossia e' valido solo quello che dichiariamo e non l'operazione contraria (ossia tutto valido tranne quello che gli diciamo noi) che mi sembra piu' ostica , visto che gli errori sono tanti e tali quasi da non poter essere classificati.

    non so le regular expression sono più lente, ma di sicuro sono molto più affidabili, leggibili e robuste proprio perche' vanno nella direzione espressa sopra... ossia verificano esattamente cosa far passare

+ Rispondi alla Discussione

Tag per Questa Discussione

^ Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •  
  • Il codice BB è Attivato
  • Le faccine sono Attivato
  • Il codice [IMG] è Attivato
  • Il codice [VIDEO] è Attivato
  • Il codice HTML è Disattivato
  • Trackbacks Attivato
  • Pingback Attivato
  • Refback Attivato

SEO by vBSEO 3.6.0 PL2 ©2011, Crawlability, Inc.