Usuari:PereBot/robot articles sense categoria

# -*- coding: utf-8 -*-
# Programa que busca en una categoria els articles que no tinguin categoria.
# Té sentit només en categories posades per plantilles.
import sys
sys.path.append('C:\pywikipedia')
import wikipedia,catlib,pagegenerators
import re

# Retorna les categories i articles d'una categoria, subcategories incloses.
# No torna a mirar les categories que ja ha mirat.
# Filtra pels noms de les categories fent servir una expressió regular.
def miracatfiltre(cat,catprevies=[],filtre=u""):
    articles=cat.articlesList(recurse=False)
    categories=cat.subcategoriesList(recurse=False)
    for scat in categories:
        wikipedia.output(scat)
#        wikipedia.output(u"Títol",scat.title())
        if scat not in catprevies:
            catprevies.append(scat)
            if filtre==u"":
                nopassa=False
                print u"Filtre desactivat"
            else:
                nopassa=re.search(filtre,scat.title())                
            if not nopassa:
                wikipedia.output(u"Sí que es llegeix %s" % scat)
                noucats,nouarts=miracatfiltre(scat,catprevies+categories,filtre)
                categories=categories+noucats
                articles=articles+nouarts
            else:
                wikipedia.output(u"No es llegeix %s" % scat)
        else:
            wikipedia.output(u"Aquesta ja la tinc vista")
    articles=catlib.unique(articles)         
    return categories, articles
    
# El programa comença aquí
def principal():
    catbuscar=u"Persones vives" #Posar aquí la categoria que es revisarà
    #filtrecats=u"Categoria:.*(?:que necessiten una (?:foto|imatge)|sense registre fòssil)" # Filtre regexp pels noms de les     categories excloses (posar =u"" per no excloure res)
    #categoria = catlib.Category(site,catbuscar)
    #cats, asc  = miracatfiltre(categoria,filtre=filtrecats)
    asc=pagegenerators.PreloadingGenerator(pagegenerators.CategorizedPageGenerator(catlib.Category(site,catbuscar)),pageNumber=120)
    #comptacategoria=len(asc)
    #asc=asc[0:-900] #Per fer només un grapat d'articles a la vegada. Per revisar la categoria sencera poseu # al davant de la línia.
    #comptapotencial=len(asc)
    comptaarticles=comptanoprincipal=comptador=0
    resum=u""
    for pag in asc:
        comptador+=1
        print comptador, pag
        if pag.exists(0) and not pag.isRedirectPage():
            text=pag.get()
            if pag.namespace()==0:
                if not re.search(u"\[\[ ?[Cc]ategoria ?:",text):
                    comptaarticles+=1
                    wikipedia.output(u"{} no té categories" % pag.title())
                    resum+="#{}\n".format(pag.title(asLink=True))
            else:
                print u"No és a l'espai principal"
                comptanoprincipal+=1
    if resum==u"":
        resum=u"Totes les pàgines tenen categories\n\n"
    paginforme=wikipedia.Page(site,"usuari:PereBot/Articles sense categories") #Pàgina on voleu l'informe. Ha d'existir.
    informe=u"\n=={}==\n\n".format(catbuscar)
    informe+=u"Articles sense categoria a la [[:categoria:{}]]:\n\n{}".format(catbuscar, resum)
    #informe+=u"La categoria (filtrada) té {} articles\n\n".format(comptacategoria)
    #informe+=u"No s'hi ha inclòs les subcategories amb títols que compleixen l'expressió regular: \n\n". format(filtrecats)
    informe+=u"Revisats {} articles\n\n".format(comptador)
    informe+=u"Trobats {} articles sense categoria\n\n".format(comptaarticles)
    informe+=u"Hi ha {} pàgines que no són a l'espai principal\n\n".format(comptanoprincipal)
    informe+=u"\n--~~~~"
    wikipedia.output(informe)
    paginforme.put(paginforme.get()+informe,catbuscar)   

if __name__ == "__main__":
    site=wikipedia.getSite("ca")
    principal()
    wikipedia.stopme()