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 handle_charref(self, name): '''Metodo invocato per caratteri speciali''' if name.startswith('x'): c = unichr(int(name[1:], 16)) else: c = unichr(int(name)) if not self.stack: return self.stack[-1].content.append( HTMLNode('_text_',{},c))
def handle_entityref(self, name): '''Metodo invocato per caratteri speciali''' if name in name2codepoint: c = unichr(name2codepoint[name]) else: c = '&'+name if not self.stack: return self.stack[-1].content.append( HTMLNode('_text_',{},c))
def handle_starttag(self, tag, attrs): '''Metodo invocato per tag aperti''' closed = tag not in ['img','br','meta','link'] node = HTMLNode(tag,dict(attrs),[],closed) if not self.root: self.root = node if self.stack: self.stack[-1].content.append(node) if closed: self.stack.append(node)
def handle_starttag(self, tag, attrs): '''Metodo invocato per tag aperti''' closed = tag not in ['img','br'] node = HTMLNode(tag, dict(attrs), [], closed) if not self.root: self.root = node #self.htmltree[node] = (dict(attrs), [], 'root') if self.stack: self.stack[-1].content.append(node) if closed: self.stack.append(node) if node != self.root: if closed: self.htmltree[node] = (tag, dict(attrs), [], self.stack[-2]) else: self.htmltree[node] = (tag, dict(attrs), [], self.stack[-1]) else: self.htmltree[node] = (tag, dict(attrs), [], None) else: self.htmltree[node] = (tag, dict(attrs), [], self.stack[-1]) if node != self.root: if closed: self.htmltree[self.stack[-2]][2].append(node) else: self.htmltree[self.stack[-1]][2].append(node)
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()
def handle_data(self, data): '''Metodo invocato per il testo''' if not self.stack: return self.stack[-1].content.append( HTMLNode('_text_',{},data))
return parser.root def fparse(fhtml): '''Esegue il parsing HTML del file fhtml e ritorna la radice dell'albero .''' with open(fhtml) as f: root = parse(f.read()) return root if __name__ == '__main__': doc = HTMLNode('html',{},[ HTMLNode('body',{},[ HTMLNode('p',{},[ HTMLNode('_text_',{},'Un paragrafo con '), HTMLNode('em',{},[ HTMLNode('_text_',{},'enfasi') ]), 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"
def remove(self): removables = self.get() if self.node in removables: return HTMLNode(*[""] * 3) jquery_fn_remove(removables, self.node, self.node)
def crea_nodo(li): tagOpen = False sonOpen = False nomeSon = '' figli = [] attr = {} nome = '' nome2 = '' closed = [ '$&/img', '$&/br', '$&/meta', '$&/link', '$&/input', '$&/br', '$&/hr', '$&img', '$&br', '$&meta', '$&link', '$&input', '$&br', '$&hr' ] for i, el in enumerate(li): if '$&' in el: #primo padre if not tagOpen and el not in closed: tagOpen = True el = el.split('"') if len(el) == 1: nome = el[0] nome = nome.replace('$&', '$&/') else: nome2 = el[0].split(' ') nome = nome2[0] nome = nome.replace('$&', '$&/') nome2 = nome2[1:] for att in nome2: dividi = att.split("=") attr[dividi[0]] = dividi[1].replace('"', '') #print('\nNodo: ', nome) #tagOpen == true elif nome in el and nome not in closed: nome = nome.replace('$&/', '') #print('--Chiudo nodo ',nome,sonOpen,tagOpen) tagOpen = False return HTMLNode(nome, attr, figli) #tagOpen == true and Not SonOpen #ho trovato il primo figlio elif not sonOpen: el2 = el.split(' ') nomeSon = el2[0] #print('\nTrovato figlio "',nomeSon,'" di ',nome) if nomeSon in closed: nomeSon = nomeSon.replace('$&', '') attributes = {} el2 = el2[1:] for att in el2: dividi = att.split("=") attributes[dividi[0]] = dividi[1] figli.append(HTMLNode(nomeSon, attributes, [])) else: nomeSon = nomeSon.replace('$&', '$&/') sonOpen = True figli.append(crea_nodo(li[i:])) #tagOpen==true and sonOpen=True e c'è il nome #ho chiuso il figlio elif sonOpen and nomeSon in el: #print('\n---Chiudo il figlio ',nomeSon," di ",nome,"---") sonOpen = False #l'elemnto corrento non è un nodo, ma il padre è aperto,ma il figlio è chiusp elif tagOpen and not sonOpen: #print("\nTrovato un figlio '",el,"' di'",nome) figli.append(HTMLNode("_text_", {}, el))