[Python] [python] problema da neofita nel gestire un albero html con due classi

nubir a libero.it nubir a libero.it
Mer 26 Nov 2014 17:55:37 CET


Salve a tutti sono un nuovo iscritto alla mailing lista.Ho bisogno di un aiuto per capire come andare avanti in un esercizio assegnatoci all'universita'.In pratica devo creare una classe che preso in input un file HTML mi genera l'albero Html della stessa e poi farci diverse operazioni sopra come contare nodi e cose simili.Ho gia' fatto un esercizio simile ma senza usare due classi ma usando una classe sola e una funzione esterna che gli passa il file HTML e va bene.Purtroppo quando sostituisco alla funzione esterna la classe che mi chiede l'esercizio iniziano i problemi.Metto l'esempio funzionanteimport 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()
Questo va bene.Il problema č che devo fare la stessa cosa perņ cambiando al posto di DEF PARSEDHTML metterci una classe PARSEDHTMLQualcosa di simileclass ParsedHTML(object):
    def __init__(self, htmlfile):
        with open(htmlfile, 'U') as f:
            root = html.parse(f.read(), HTMLNode)

L'albero me lo crea ma non so poi come fare il count, in pratica non so come interagirci con l'albero appena creato perche' se faccio p.count mi dice che la mia classe non ha l'attributo count.Avevo pensato di fare una def count anche sotto questa classe che mi richiamasse la prima ma non riesco a ricavarmi i dati del primo costruttore per poi lavorarci su. Dove sbaglio? Come posso interagire con l'albero appena creato? Qualcuno puņ aiutarmi a capire? Grazie mille
-------------- parte successiva --------------
Un allegato HTML č stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20141126/152a3e4e/attachment-0001.html>


Maggiori informazioni sulla lista Python