def conta_nodi(fileIn, selettore):
    '''Torna il numero di nodi dell'albero, che soddisfano il selettore CSS.'''
    htmlfile=fparse(fileIn)
    stringahtml=HTMLNode.to_string(htmlfile)
    contatore=0
    indici=[]
    if '.' in selettore:
        selettore='header '+selettore.strip('.')
    elif '#' in selettore:
        selettore=selettore.strip('#')
    elif '@' in selettore:
        selettore=selettore.strip('@[]')
    elif ' ' in selettore:
        if '<'+selettore[0] in stringahtml:
            if '<'+selettore[2:] in stringahtml:
                if stringahtml.find('<'+selettore[2:])>stringahtml.find('<'+selettore[0]):
                    selettore='<'+selettore[2:]
    elif '>' in selettore:
        if '<'+selettore[0] in stringahtml:
            if '<'+selettore[4:] in stringahtml:
                if stringahtml.find('<'+selettore[4:])>stringahtml.find('<'+selettore[0]):
                    selettore='<'+selettore[4:]
    else:
        selettore='</'+selettore+'>'

    i=stringahtml.find(selettore, contatore)
    while i>=0:
        indici.append(i)
        i=stringahtml.find(selettore, i+1)
    return len(indici)
def cambia_attributo(fileIn, selettore, chiave, valore, fileOut):
    '''Modifica tutti i nodi dell'albero che soddisfano il selettore CSS'''
    nodo = fparse(fileIn)
    tag = selettore.split()
    if len(tag) > 1:
        if '>' in tag:
            d = tag.count('>')
            i = 0
            while d > 0:
                i = tag.index('>', i + 1)
                t = find_by_tag(nodo, tag[i - 1])
                for k in t:
                    t = find_by_tag1(k, tag[i + 1])
                d -= 1
        else:
            t = find_by_tag(nodo, tag[0])
            for k in t:
                t1 = find_by_tag(k, tag[1])
                for k in t1:
                    k.attr[chiave] = valore
    for k in tag:
        if '.' in k:
            t = find_by_attr(nodo, selettore)
            for k in t:
                k.attr[chiave] = valore
        if '#' in k:
            t = find_by_av(nodo, selettore)
            for k in t:
                k.attr[chiave] = valore
        if '@' in k:
            selettore = k.replace('[', '')
            selettore = selettore.replace(']', '')
            selettore = selettore.replace('=', ' ')
            s = selettore.split()
            attr = s[0]
            val = s[1]
            attr = attr.replace('@', '')
            val = val.replace('"', '')
            t = find_by_val(nodo, attr, val)
            for k in t:
                k.attr[chiave] = valore
        if k.isalpha():
            t = find_by_tag(nodo, selettore)
            for k in t:
                k.attr[chiave] = valore
    with open(fileOut, 'w') as o:
        o.write(HTMLNode.to_string(nodo))
    o.close()
def elimina_nodi(fileIn, selettore, fileOut):
    '''Elimina dall'albero tutti i nodi che soddisfano il selettore CSS (compreso il loro contenuto)'''
    nodo = fparse(fileIn)
    tag = selettore.split()
    if len(tag) > 1:
        if '>' in tag:
            d = tag.count('>')
            i = 0
            while d > 0:
                i = tag.index('>', i + 1)
                t = find_by_tag(nodo, tag[i - 1])
                for k in t:
                    remove_by_tag(k, tag[i + 1])
                d -= 1
        else:
            t = find_by_tag(nodo, tag[0])
            for k in t:
                remove_by_tag(k, tag[1])

    for k in tag:
        if '.' in k:
            remove_by_tag(nodo, k.replace('.', ''))
        if '#' in k:
            remove_by_tag(nodo, k.replace('#', ''))
        if '@' in k:
            selettore = k.replace('[', '')
            selettore = selettore.replace(']', '')
            selettore = selettore.replace('=', ' ')
            s = selettore.split()
            attr = s[0]
            val = s[1]
            attr = attr.replace('@', '')
            val = val.replace('"', '')
            remove_by_tag(nodo, attr, val)
        if k.isalpha() and len(tag) == 1:
            remove_by_tag(nodo, k)
    with open(fileOut, 'w') as o:
        o.write(HTMLNode.to_string(nodo))
    o.close()
                        HTMLNode('_text_',{},' e un\'immagine'),
                        HTMLNode('img',{'src':'img_logo.png'}, [],closed=False)
                    ])
                ])
            ])

    # stampa la struttura nell'albero
    doc.print_tree()
    # Out: <html>
    # Out:   <body>
    # Out:     <p>
    # Out:       _text_ 'Un paragrafo con '
    # Out:       <em>
    # Out:         _text_ 'enfasi'
    # Out:       _text_ " e un'immagine"
    # Out:       <img>

    # stampa la stringa HTML corrispodente
    print(doc.to_string())
    # Out: <html><body><p>Un paragrafo con <em>enfasi</em> e un'immagine<img src="img_logo.png"></p></body></html>


    # Proviamo a fare il parsing del semplice file
    # che abbiamo visto sopra.
    doc = fparse('page.html')

    doc.print_tree()

    print(doc.to_string())