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)
Example #5
0
 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"
Example #10
0
    def remove(self):
        removables = self.get()
        if self.node in removables:
            return HTMLNode(*[""] * 3)

        jquery_fn_remove(removables, self.node, self.node)
Example #11
0
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))