Código de Python - Analizador del contenido de una página web

Imágen de perfil

Analizador del contenido de una página webgráfica de visualizaciones


Python

Publicado el 06 de Marzo del 2014 por Xavi
1.618 visualizaciones desde el 06 de Marzo del 2014. Una media de 14 por semana
Clase de python que analiza el contenido de un archivo html, y puede devolver:
- El numero de palabras sin contar los tags HTML
- Una lista con todas las urls que contiene dicha página
- El titulo de la página
- El contenido de la página
- Devuelve una lista con todos los "title" de las url, imágenes, etc...
- Devuelve una lista con los "alt" de las imágenes, etc...
- Devuelve una lista con los meta de la pagina

Versión 1

Publicado el 06 de Marzo del 2014gráfica de visualizaciones de la versión: Versión 1
1.619 visualizaciones desde el 06 de Marzo del 2014. Una media de 14 por semana
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
"""
class URLLister

Los valores que contiene son:
    self.url		las urls de la pagina
    self.urlsAlt	contenido de los tags alt de los enlaces
    self.urlsTitle	contenido de los tags title de los enlaces
    self.title		titulo de la web
    self.data		contenido de la web sin tags

    self.titleTag	Determina si estamos actualmente revisando el tag <title></title>
    self.bodyTag	Determina si estamos actualmente revisando el tag <body></body>
    self.styleTag	Determina si estamos dentro del tag <style>

"""
 
from sgmllib import SGMLParser
from urlparse import urlparse
import os
 
class URLLister(SGMLParser):
 
    extension_UrlsNoAdd=["m3u","jpg","jpeg","gif","png","swf","avi","iso","ogg","mp3","zip","wml","mkv","flv"]
    sufijo_UrlsNoAdd=["ru","cn","jp","kr","tw","th","cc","kz","kg","kw","la","ua","cz","bg"]
 
    def __init__(self):
        self.bodyTag=False
        self.titleTag=False
        self.styleTag=False
        SGMLParser.__init__(self)
 
    def reset(self):
        SGMLParser.reset(self)
        # Contiene las urls de la pagina
        self.urls=[]
        # Contiene los title de la url si lo tienen
        self.urlsTitle=[]
        # Contiene los alt de las imagenes si los tienen
        self.urlsAlt=[]
        # Contiene el contenido de la web sin tags
        self.data=[]
        # Contiene el titulo de la web
        self.title=[]
        # Contiene el content del meta keywords y description
        self.meta=[]
 
    """
    Esta funcion es llamada cada vez que encuentra <a
    attrs es una lista de tuplas con atributo valor [('href', 'pagina.php'), ('target', '_blank')]
    """
    def start_a(self, attrs):
        self.addAttrs(attrs)
 
    def start_frame(self, attrs):
        self.addAttrs(attrs)
 
    def start_iframe(self, attrs):
        self.addAttrs(attrs)
 
    # Esta funcion es llamada cada vez que encuentra <img
    def start_img(self, attrs):
        self.addAttrs(attrs)
 
    # Esta funcion es llamada cada vez que encuentra <table
    def start_table(self, attrs):
        self.addAttrs(attrs)
 
    """
    Esta funcion es llamada cada vez que encuentra <meta
    recibe una lista de tubplas con todo el contenido del meta del tipo:
        [('name', 'title'), ('content', 'La Web del Programador.com')]
    """
    def start_meta(self, attrs):
        self.addAttrsMeta(attrs)
 
    def addAttrsMeta(self,attrs):
        keywords=False
        description=False
        #print attrs
        for k, v in attrs:
            if k.lower()=="name" and v.lower()=="keywords":
                keywords=True
            if k.lower()=="name" and v.lower()=="description":
                description=True
            if keywords==True and k.lower()=="content":
                self.meta.append(("keywords", v))
            if description==True and k.lower()=="content":
                self.meta.append(("description", v))
 
    def addAttrs(self,attrs):
        for k, v in attrs:
            # Si es una "<a href=" o un "<frame src=" o un "<iframe src="
            if k.lower()=='href' or k.lower()=='src':
                # Comprovamos que no sea un mail
                if not "mailto:" in v.lower():
                    # Si esta url no ha sido ya agregada
                    if not v in self.urls:
                        # Comprovamos la extension del archivo
                        coincidenciaExt=False
                        for ext in self.extension_UrlsNoAdd:
                            if v.lower()[-len(ext):]==ext:
                                coincidenciaExt=True
                                break
                        # Comprovamos el sufijo
                        coincidenciaSufijo=False
                        domain=urlparse(v.lower()).netloc
                        for sufijo in self.sufijo_UrlsNoAdd:
                            if domain[-len(sufijo):]==sufijo:
                                coincidenciaSufijo=True
                                break
                        # Si no coincide la extension y el sufijo
                        if coincidenciaExt==False and coincidenciaSufijo==False:
                            self.urls.append(v)
            if k.lower()=='alt':
                if not v in self.urlsAlt:
                    self.urlsAlt.append(v)
            if k.lower()=='title':
                if not v in self.urlsTitle:
                    self.urlsTitle.append(v)
 
    # determinar cuando empieza el tag <title
    def start_title(self, attrs):
        self.titleTag=True
 
    # Determina cuando finaliza el tab </title>
    def end_title(self):
        self.titleTag=False
 
    # Determina cuando empieza el tab <body
    def start_body(self,attrs):
        self.bodyTag=True
 
    # Determina cuando finaliza el tab </body>
    def end_body(self):
        self.bodyTag=False
 
    # Determina cuando empieza el tab <style
    def start_style(self,attrs):
        self.styleTag=True
 
    # Determina cuando finaliza el tab </style>
    def end_style(self):
        self.styleTag=False
 
    """
    Polimorfismo
    Obtiene el texto que no esta entre tags
    Recibe data que contiene el texto
    """
    def handle_data(self,data):
        #print data
        if self.styleTag==False:
            if self.titleTag==True:
                # Cogemos el titulo
                self.title.append(data.strip())
            else:
                # Cogemos el contenido
                if data.strip():
                    #if not data in self.data:
                    self.data.append(data.strip())
 
    """
    Devuelve el numero de palabras de una lista
    Tiene que recibir la lista y opcionalmente puede indicar el minimo
    de longitud de caracteres de las palabras (Sample: 3 quiere decir que
    unicamente devolvera palabras con 3 caracteres o mas.
    """
    def numberWords(self,listToReview,minLen=0):
        words=0
        for values in listToReview:
            if minLen==0:
                words+=len(values.split())
            else:
                for i in values.split():
                    if len(i)>=minLen:
                        words+=1
        return words
 
if __name__=="__main__":
    obj=URLLister()
    if len(os.sys.argv)==3:
        """
        Tiene que recibir el archivo a analizar y la opcion 1|2|3...
        urlLister.py /path/index.html 4
        """
        obj.feed(file(os.sys.argv[1],"r").read())
        if os.sys.argv[2]=="1": # Devuelve el numero de palabras
            print "%s#%s#%s#%s" % (obj.numberWords(obj.title),obj.numberWords(obj.data,3),obj.numberWords(obj.urlsTitle,2),obj.numberWords(obj.urlsAlt))
        if os.sys.argv[2]=="2": # Devuelve las urls
            print obj.urls
        if os.sys.argv[2]=="3": # Devuelve el titulo
            print obj.title
        if os.sys.argv[2]=="4": # Devuelve el contenido
            print obj.data
        if os.sys.argv[2]=="5": # Devuelve los title de las urls y demas
            print obj.urlsTitle
        if os.sys.argv[2]=="6": # Devuelve los alt de las imagenes y demas
            print obj.urlsAlt
        if os.sys.argv[2]=="7": # Devuelve los meta
            print obj.meta
    else:
        print "python archivo.py archivo.html [1|2|3|4|5|6|7]"



Comentarios sobre la versión: Versión 1 (0)


No hay comentarios
 

Comentar la versión: Versión 1

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios

http://lwp-l.com/s2621