Usuario:InfoBot/infobot.py
Apariencia
# -*- 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()