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())