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?