Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [python] albero di parsing html per neofita python

    Allora premetto che il tutto è un esercizio universitario quindi serve solo per imparare.
    In pratica l'esercizio mi chiede di fare una classe che rappresenta un albero di parsing con un costruttore che mi prende una pagina html e costruisce l'albero. Suppongo quindi di dover creare due classi, una che effettua fisicamente l'operazione e la classe richiesta che semplicemente gli passa il file. (Se mi avesse chiesto di passargli il file tramite una funzione avrei risolto) invece deve essere una classe. Io ho fatto cosi':

    codice:
    import html
    
    class HTMLNode(object):
        def __init__(self, tag, attr, content, closed=True):
            self.tag = tag
            self.attr = attr # dizionario degli attributi, se non ci sono, e' un dizionario vuoto
            self.content = content  # se tag = '_text_' contiene il testo, altrimenti una lista dei nodi figli
            self.closed = closed  # True se il nodo ha la chiusura
    
    
    
    class ParsedHTML(object):
        def __init__(self, htmlfile):
            with open(htmlfile, 'U') as f:
                html.parse(f.read(), HTMLNode)
    Se chiamo la classe cosi':
    pippo = ParsedHTML('nomefile.html')
    pare che non mi da errori e con il debug SEMBRA che l'albero lo abbia costruito.
    Ora il problema è che devo contare quanti nodi ha l'albero e farci altre operazioni ma
    non restituendomi nulla su pippo non riesco a fare niente.
    Se aggiungo un return sotto il costruttore in pardesHTML mi da un errore e mi dice che deve ritornare none non l'oggetto.
    Come faccio quindi a effettuare operazioni sull'albero creato? con pippo. qualcosa?
    Se creo una funzione count in htmlnode e la richiamo con pippo.count mi da mille errori perche' la funzione ParseHTML non ha attributi content, tag etc etc....
    Ho provato anche a mettere sia nella prima che nella seconda classe questo:


    codice:
    def istext(self):# per distinguere i nodi testo
        return self.tag == '_text_'
    def count(self):
        cnt = 1ifnot self.istext():
        for node in self.content:
            cnt += node.count()        
        return cnt
    Ma se lo metto in HTMLNode e lo richiamo con p.count() mi dice che la classe parser non ha attributi content tag etc...
    Se lo metto nella classe parser idem...
    Qualcuno può farmi capire come procedere?
    Ultima modifica di Dragobianco; 26-11-2014 a 12:51

  2. #2
    Per integrazione se faccio una sola classe con la FUNZIONE che gli passa il file mi funziona tutto:
    ES:
    codice:
    import html
    
    class HTMLNode(object):
        def __init__(self, tag, attr, content, closed=True):
            self.tag = tag
            self.attr = attr # dizionario degli attributi, se non ci
                             # sono, e' un dizionario vuoto
            self.content = content  # se tag = '_text_' contiene il testo,
                                    # altrimenti una lista dei nodi figli
            self.closed = closed  # True se il nodo ha la chiusura
    
    
        def istext(self):    # per distinguere i nodi testo
            return self.tag == '_text_'
    
    
        def print_tree(self, level=0):
            '''Stampa l'albero mostrando la struttura tramite indentazione'''
            print '    '*level+str(self),
            if self.istext():
                print repr(self.content)
            else:
                print
                for node in self.content:
                    node.print_tree(level+1)
    
    
        def __str__(self):
            '''Ritorna una rapprentazione testuale del nodo'''
            left, right = ('', '') if self.tag == '_text_' else ('<', '>')
            s = left+self.tag
            for k, v in self.attr.items():
                s += ' '+k+'="'+v+'"'
            return s + right
    
    
        def count(self):
            '''Ritorna il numero di nodi dell'albero'''
            cnt = 1
            if not self.istext():
                for node in self.content:
                    cnt += node.count()
            return cnt
    
    
    
    
    def ParsedHTML(htmlfile):
        '''Esegue il parsing HTML del file fhtml e ritorna la radice
        dell'albero di parsing'''
        with open(htmlfile, 'U') as f:
            root = html.parse(f.read(), HTMLNode)
        return root
    ###########################################################################
    
    
    
    
    p = ParsedHTML('file03_01_in.html')
    print p.print_tree()
    print p.count()
    perche' facendo al posto dlela funzione la seconda classe non va?

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.