#!/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