# -*- coding: utf-8 -*-
# Jesús Ruiz-Ayúcar Vázquez <chuso AT gnoma DOT es>
# Copyright (C) 2007 Jesús Ruiz-Ayúcar Vázquez
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import sys, re , time, sets, getopt
import wikipedia, pagegenerators, catlib, config
# Acerca de infobot.py:
#
# Este script se encarga de averiguar qué campos del infobox de ciudades están completados
# El único requisito es partir de una página en la que todos los enlaces apunten a los municipios
# que se quieran analizar. Se puede personalizar los campos comprobar, para ello deben ponerse a
# True o False cada parámetro. Además, para poder comprobar que la alcaldía y el censo están actualizados
# se deben utilizar los campos alcalde_año y ine_año en el infobox respectivamente.
#
# Para establecer la página sobre la que trabajar hay que añadir la ruta relativa en el campo url
# Parámetros globales
url = u"Wikiproyecto:Toledo/Infobox" # url en la que están los enlaces a municipios
infobox = False # Para comprobar existencia del infobox
mapa = True # Para comprobar existencia del mapa
coor = False # Para comprobar existencia de las coordenadas
altitud = False # Para comprobar existencia de la altitud
superficie = False # Para comprobar existencia de la superficie
poblacion = False # Para comprobar existencia de población.
# Debe tener un año ine en el campo ine_anyo
ine_anyo = 2006
gentilicio = True # Para comprobar existencia del gentilicio
alcaldia = False # Para comprobar existencia de la alcaldía (alcalde o
# alcaldesa). Debe tener un año de alcaldía en alcaldia_anyo
alcaldia_anyo = 2007
tamanyo = True # Para extraer el tamaño del documento
codigo_postal = True # Para comprobar existencia del código postal
escudo = True # Para comprobar existencia del escudo
bandera = True # Para comprobar existencia de la bandera
patron = True # Para comprobar existencia del patrón
patrona = True # Para comprobar existencia de la patrona
partido = True # Para comprobar existencia del partido judicial
capital = True # Para comprobar existencia de la distancia a la
# capital de provincia. Debe tener el nombre de la
# capital en nombre_capital
nombre_capital = "Toledo"
verbose = False # Modo verboso, para que muestre información por consola
debug = False # Modo debug, para que no actualicer y comprobar
# previamente el resultado
yes = u"Ok" # Texto que indicará que el campo existe y es correcto
no = u"" # Texto que indicará que el campo no existe o es erróneo
def usage():
wikipedia.output(u"Cómo usar este script\n")
wikipedia.output(u"-h, --help: Muestra esta ayuda")
wikipedia.output(u"-d, --debug: Modo debug. No actualiza la página y muestra la salida")
wikipedia.output(u"--infobox=[si|no]: Comprobar existencia de infobox")
wikipedia.output(u"--mapa=[si|no]: Comprobar existencia de mapa")
wikipedia.output(u"--coor=[si|no]: Comprobar existencia de coordenadas")
wikipedia.output(u"--altitud=[si|no]: Comprobar existencia de altitud")
wikipedia.output(u"--superficie=[si|no]: Comprobar existencia de superficie")
wikipedia.output(u"--poblacion=[si|no]: Comprobar existencia de poblacion")
wikipedia.output(u"--ine_ayo=[año]: Establecer año del censo INE")
wikipedia.output(u"--gentilicio=[si|no]: Comprobar existencia de gentilicio")
wikipedia.output(u"--alcaldia=[si|no]: Comprobar existencia de alcaldia")
wikipedia.output(u"--alcaldia_anyo=[año]: Establecer primer año de la legislatura de la alcaldia")
wikipedia.output(u"--tamanyo=[si|no]: Mostrar tamaño del artículo")
wikipedia.output(u"--codigo_postal=[si|no]: Comprobar existencia de codigo postal")
def getparams():
global infobox, mapa, coor, altitud, superficie, poblacion, ine_anyo, gentilicio, alcaldia, alcaldia_anyo, tamanyo, codigo_postal
try:
opts, args = getopt.getopt(sys.argv[1:], "hd:v", ["help", "debug", "infobox=", "mapa=", "coor=", "altitud=", "superficie=", "poblacion=", "ine_anyo=", "gentilicio=", "alcaldia=", "alcaldia_anyo=", "tamanyo=", "codigo_postal="])
except getopt.GetoptError:
# Mostrar información de ayuda y salir
usage()
sys.exit(2)
for o, a in opts:
if o == "-v":
verbose = True
if o in ("-h", "--help"):
usage()
sys.exit()
if o in ("-d", "--debug"):
debug = True
if o in ("--infobox"):
if a in ("si", "Si"):
infobox = True
if a in ("no", "No"):
infobox = False
if o in ("--mapa="):
if a in ("si", "Si"):
mapa = True
if a in ("no", "No"):
mapa = False
if o in ("--coor="):
if a in ("si", "Si"):
coor = True
if a in ("no", "No"):
coor = False
if o in ("--altitud="):
if a in ("si", "Si"):
altitud = True
if a in ("no", "No"):
altitud = False
if o in ("--superficie="):
if a in ("si", "Si"):
superficie = True
if a in ("no", "No"):
superficie = False
if o in ("--poblacion="):
if a in ("si", "Si"):
poblacion = True
if a in ("no", "No"):
poblacion = False
if o in ("--gentilicio="):
if a in ("si", "Si"):
gentilicio = True
if a in ("no", "No"):
gentilicio = False
if o in ("--alcaldia="):
if a in ("si", "Si"):
alcaldia = True
if a in ("no", "No"):
alcaldia = False
if o in ("--tamanyo="):
if a in ("si", "Si"):
tamanyo = True
if a in ("no", "No"):
tamanyo = False
if o in ("--codigo_postal="):
if a in ("si", "Si"):
codigo_postal = True
if a in ("no", "No"):
codigo_postal = False
if o in ("--ine_anyo="):
ine_anyo = a
if o in ("--alcaldia_anyo="):
alcaldia_anyo = a
def main():
# Parametros wikipedia
es_site = wikipedia.Site('es','wikipedia','InfoBot')
sp = wikipedia.Page(es_site, url)
getparams()
# Salida preliminar
salida=u""
salida+=u"{| class=\"wikitable\"\n"
salida+=u"|+ '''Código de colores'''\n"
salida+=u"! Color\n"
salida+=u"! Clave\n"
salida+=u"! Rango (bytes)\n"
salida+=u"|-\n"
salida+=u"| bgcolor=\"#ff0000\"| || #ff0000 || 0-500\n"
salida+=u"|-\n"
salida+=u"| bgcolor=\"#ff3000\"| || #ff3000 || 501-1000\n"
salida+=u"|-\n"
salida+=u"| bgcolor=\"#ff6000\"| || #ff6000 || 1001-2000 \n"
salida+=u"|-\n"
salida+=u"| bgcolor=\"#ff9000\"| || #ff9000 || 2001-3000\n"
salida+=u"|-\n"
salida+=u"| bgcolor=\"#ffc000\"| || #ffc000 || 3001-4000\n"
salida+=u"|-\n"
salida+=u"| bgcolor=\"#ffff00\"| || #ffff00 || 4001-5000\n"
salida+=u"|-\n"
salida+=u"| bgcolor=\"#ccff00\"| || #ccff00 || 5001-6000\n"
salida+=u"|-\n"
salida+=u"| bgcolor=\"#99ff00\"| || #99ff00 || 6001-7000\n"
salida+=u"|-\n"
salida+=u"| bgcolor=\"#66ff00\"| || #66ff00 || 7001-8000\n"
salida+=u"|-\n"
salida+=u"| bgcolor=\"#33ff00\"| || #33ff00 || 8001-9000\n"
salida+=u"|-\n"
salida+=u"| bgcolor=\"#00ff00\"| || #00ff00 || >9001\n"
salida+=u"|}\n\n"
salida+=u"{| class=\"sortable wikitable\"\n"
salida+=u"! Municipio\n"
if infobox:
salida+=u"! Infobox\n"
if mapa:
salida+=u"! Mapa\n"
if coor:
salida+=u"! Coord\n"
if altitud:
salida+=u"! Altitud\n"
if superficie:
salida+=u"! Superf\n"
if poblacion:
salida+=u"! Pob. %d\n" % (ine_anyo)
if gentilicio:
salida+=u"! Gentilicio\n"
if alcaldia:
salida+=u"! Alcaldía %d\n" % (alcaldia_anyo)
if codigo_postal:
salida+=u"! CP\n"
if escudo:
salida+=u"! Escudo\n"
if bandera:
salida+=u"! Bandera\n"
if patron:
salida+=u"! Patrón\n"
if patrona:
salida+=u"! Patrona\n"
if partido:
salida+=u"! Partido\n"
if capital:
salida+=u"! Distancia a capital\n"
if tamanyo:
salida+=u"! Tamaño\n"
# Generamos lista de poblaciones
gen = pagegenerators.LinkedPageGenerator(sp)
gen = pagegenerators.NamespaceFilterPageGenerator(gen,[0])
preloadingGen = pagegenerators.PreloadingGenerator(gen, pageNumber = 500)
# Navegamos por cada municipio para extraer información
for page in preloadingGen:
# Obtenemos solo enlaces a páginas "reales"
if re.search(ur"Image",page.title()):
continue
if page.isRedirectPage():
page=wikipedia.Page(page.site(), page.getRedirectTarget())
# Extraemos el texto
texto=page.get()
# Comprobamos si tiene infobox
if infobox:
infobox_output=no
if re.search(ur"(?s)\{\{[Ii]nfobox.ciudad.España",texto):
infobox_output=yes
# Comprobamos si tiene mapa
if mapa:
mapa_output=no
if re.search(ur"(?s)\|\s*[iI]magen?\s*=\s*\[\[[Ii]magen?:.+\]\]", texto):
mapa_output=yes
# Comprobamos si tiene coordenadas
if coor:
coor_output=no
if re.search(ur"(?s)\|\s*coor\s*=\s*\{\{coor d?m?s?\|[\d\|]+\|[NnSs][\d\|]+\|[EeOoWw][\|]?\}\}", texto):
coor_output=yes
# Comprobamos si tiene altitud
if altitud:
altitud_output=no
if re.search(ur"(?s)\|\s*altitud\s*=\s*\d", texto):
altitud_output=yes
# Comprobamos si tiene superficie
if superficie:
superficie_output=no
if re.search(ur"(?s)\|\s*superficie\s*=\s*\d", texto):
superficie_output=yes
# Comprobamos si tiene población
if poblacion:
poblacion_output=no
if re.search(ur"(?s)\|\s*población\s*=\s*\d", texto):
if re.search(ur"(?s)\|\s*ine_año\s*=\s*%d" % (ine_anyo), texto):
poblacion_output=yes
# Comprobamos si tiene gentilicio
if gentilicio:
gentilicio_output=no
if re.search(ur"(?s)\|\s*gentilicio\s*=\s*[\wá-úÁ-ÚñÑ]+", texto):
gentilicio_output=yes
if codigo_postal:
codigo_postal_output=no
if re.search(ur"(?s)\|\s*cp\s*=\s*\d{4,5}", texto):
codigo_postal_output=yes
# Comprobamos si tiene alcalde
if alcaldia:
alcaldia_output=no
if re.search(ur"(?s)\|\s*alcalde(sa)?\s*=\s*\[?\[?[\wá-úÁ-ÚñÑ]+", texto):
if re.search(ur"(?s)\|\s*alcalde(sa)?_año\s*=\s*%d" % (alcaldia_anyo), texto):
alcaldia_output=yes
# Comprobamos si tiene escudo
if escudo:
escudo_output=no
if not re.search(ur"(?s)\|\s*escudo\s*=\s*no", texto):
if re.search(ur"(?s)\|\s*escudo\s*=\s*[\wá-úÁ-ÚñÑ\-\_\.]+", texto):
escudo_output=yes
# Comprobamos si tiene bandera
if bandera:
bandera_output=no
if not re.search(ur"(?s)\|\s*bandera\s*=\s*no", texto):
if re.search(ur"(?s)\|\s*bandera\s*=\s*[\wá-úÁ-ÚñÑ\-\_\.]+", texto):
bandera_output=yes
# Comprobamos si tiene patrón
if patron:
patron_output=no
if re.search(ur"(?s)\|\s*patrón\s*=\s*\[?\[?[\wá-úÁ-ÚñÑ]+", texto):
patron_output=yes
# Comprobamos si tiene patrona
if patrona:
patrona_output=no
if re.search(ur"(?s)\|\s*patrona\s*=\s*\[?\[?[\wá-úÁ-ÚñÑ]+", texto):
patrona_output=yes
# Comprobamos si tiene partido
if partido:
partido_output=no
if re.search(ur"(?s)\|\s*partido\s*=\s*\[?\[?[\wá-úÁ-ÚñÑ]+", texto):
partido_output=yes
# Comprobamos si tiene la distancia a la capital
if capital:
capital_output=no
m = re.search(ur"(?s)\|\s*referencia(\d*)\s*=\s*\[?\[?%s\]?\]?" % (nombre_capital),texto,re.IGNORECASE)
if (m):
ref_id = m.group(1)
p = re.search(ur"(?s)\|\s*distancia%s\s*=\s*\d+" % (ref_id),texto)
if (p):
capital_output=yes
# Asignamos un color en función del tamaño en bytes de la página
if tamanyo:
tam=len(texto)
if tam <500:
tam_s='bgcolor="#ff0000" | %d' % (tam)
elif tam < 1000:
tam_s='bgcolor="#ff3000" | %d' % (tam)
elif tam < 2000:
tam_s='bgcolor="#ff6000" | %d' % (tam)
elif tam < 3000:
tam_s='bgcolor="#ff9000" | %d' % (tam)
elif tam < 4000:
tam_s='bgcolor="#ffc000" | %d' % (tam)
elif tam < 5000:
tam_s='bgcolor="#ffff00" | %d' % (tam)
elif tam < 6000:
tam_s='bgcolor="#ccff00" | %d' % (tam)
elif tam < 7000:
tam_s='bgcolor="#99ff00" | %d' % (tam)
elif tam < 8000:
tam_s='bgcolor="#66ff00" | %d' % (tam)
elif tam < 9000:
tam_s='bgcolor="#33ff00" | %d' % (tam)
else:
tam_s='bgcolor="#00ff00" | %d' % (tam)
if verbose:
# Mostramos salida por consola
wikipedia.output( u"==== %s ==== (%s) - (%d) - %s" % (page.title(),infobox,tam, coor) )
# Sacamos el código wikipedia con la fila del municipio
salida+=u"|--\n| [[%s]]" % (page.title())
if infobox:
salida+=u" || %s" % (infobox_output)
if mapa:
salida+=u" || %s" % (mapa_output)
if coor:
salida+=u" || %s" % (coor_output)
if altitud:
salida+=u" || %s" % (altitud_output)
if superficie:
salida+=u" || %s" % (superficie_output)
if poblacion:
salida+=u" || %s" % (poblacion_output)
if gentilicio:
salida+=u" || %s" % (gentilicio_output)
if alcaldia:
salida+=u" || %s" % (alcaldia_output)
if codigo_postal:
salida+=u" || %s" % (codigo_postal_output)
if escudo:
salida+=u" || %s" % (escudo_output)
if bandera:
salida+=u" || %s" % (bandera_output)
if patron:
salida+=u" || %s" % (patron_output)
if patrona:
salida+=u" || %s" % (patrona_output)
if partido:
salida+=u" || %s" % (partido_output)
if capital:
salida+=u" || %s" % (capital_output)
if tamanyo:
salida+=u" || %s" % (tam_s)
salida+=u" \n"
salida+=u"|}"
if debug:
wikipedia.output( u"%s" % (salida) )
else:
# Actualizamos información en la wikipedia
sp.put(salida,comment=u"actualizando", minorEdit= True)
if __name__ == "__main__":
main()