Usuari:PereBot/robot categories redundants
Aparença
# -*- coding: utf-8 -*-
# Programa per buscar categories redundants
# Guarda en un fitxer un diccionari amb l'estructura de les categories que
# ha llegit, per estalviar feina els següents cops.
import sys
sys.path.append('C:\pywikipedia')
import wikipedia,catlib,urllib2,re,pickle
# Retorna les categories d'una categoria, subcategories incloses (no articles).
# No torna a mirar les categories que ja ha mirat.
# Filtra pels noms de les categories fent servir una expressió regular.
# Fa servir un diccionari (diccat) per guardar les subcategories de cada categoria.
# Si actualitza=True no consulta el diccionari però l'escriu igualment (serveix
# per actualitzar al diccionari les categories que fa servir)
def miracatfiltrecat(cat,catprevies=[],filtre=u"",diccat={},actualitza=False):
diccatk=diccat.keys()
if (cat in diccatk) and (not actualitza):
categories=diccat[cat]
# try:
# print cat,u"té",categories,u"segons el diccionari"
# except UnicodeEncodeError:
# print "No imprimible"
else:
categories=cat.subcategoriesList(recurse=False)
diccat[cat]=categories
for scat in categories:
# print scat
# print 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:
# print u"Sí que es llegeix", scat
noucats,diccat=miracatfiltrecat(scat,catprevies+categories,filtre,diccat,actualitza)
categories=categories+noucats
# else:
# print u"No es llegeix", scat
# else:
# print scat,u"ja la tinc vista"
categories=catlib.unique(categories)
# print u"Llegides",len(categories),u"categories a",cat
return categories,diccat
# 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.
# Fa servir un diccionari (diccat) per guardar les subcategories de cada categoria (pel següent cop que s'executi).
# Si actualitza=True no consulta el diccionari però l'escriu igualment (serveix
# per actualitzar al diccionari les categories que fa servir)
def miracatfiltre(cat,catprevies=[],filtre=u"",diccat={},actualitza=False):
articles=cat.articlesList(recurse=False)
diccatk=diccat.keys()
if (cat in diccatk) and (not actualitza):
categories=diccat[cat]
try:
print cat,u"té",categories,u"segons el diccionari"
except UnicodeEncodeError:
print "No imprimible"
else:
categories=cat.subcategoriesList(recurse=False)
diccat[cat]=categories
for scat in categories:
print scat
# print 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:
print u"Sí que es llegeix", scat
noucats,nouarts,diccat=miracatfiltre(scat,catprevies+categories,filtre,diccat,actualitza)
categories=categories+noucats
articles=articles+nouarts
else:
print u"No es llegeix", scat
else:
print u"Aquesta ja la tinc vista"
categories=catlib.unique(categories)
articles=catlib.unique(articles)
print u"Llegits",len(categories),u"categories i",len(articles),u"articles a",cat
return categories, articles, diccat
# Converteix un set de categories en una cadena de text
def formatset(conjunt):
text=u""
for categoria in conjunt:
if len(text)>0:
text=text+u", "
text=text+u"[[:"+categoria.title()+u"]]"
return text
def main():
origen=u"Berguedà" # Posar aquí una categoria per buscar-hi articles amb categories redundants
catorigen=catlib.Category(site,origen)
print u"Carregant diccionari"
fitx=open("categories.txt",'r')
bibliocats=pickle.load(fitx) # Diccionari amb la llista de totes les subcategories d'una categoria (només un nivell)
fitx.close()
print u"Diccionari carregat"
filtrecats=u"Categoria:(.*((Cànids|Amer|Sant Hilari Sacalm|Arbúcies|Anoia|necessiten una foto|sense registre fòssil)|(Selva|Gironès|Girona|Ripollès|Empordà|Vallespir|Baix Cinca|[Aa]noiencs|[Pp]almesans|Mallorca|[Bb]alears|[Mm]allorquins|[Vv]al[eè]nci(à|a|ans)|Alacant|Metges).*))"
catnul,articles,bibliocats=miracatfiltre(catorigen,filtre=filtrecats,diccat=bibliocats,actualitza=False) # Normalment, actualitza=False (valor per defecte)
# articles.reverse() # Posar només si es vol començar pel final.
informe=u""
comptador=0
comptabloc=0
numarticles=len(articles)
paginforme=wikipedia.Page(site,u"Usuari:PereBot/categories redundants")
textvell=paginforme.get()
wikipedia.getall(site,articles)
for pag in articles:
comptador=comptador+1
comptabloc=comptabloc+1
print u"\n",comptador,"/",numarticles,u"Comprovant article",pag
if pag.isRedirectPage():
pag=pag.getRedirectTarget()
print "Redirecciona a",pag
if pag.isRedirectPage():
print "Doble redirecció"
break
catspag=pag.categories()
# print catspag
if len(catspag)>1:
scatspag=set(catspag)
for catp in catspag:
print u"Provant la categoria",catp,u"a l'article",pag
tcatp=catp.title()
lcat,bibliocats=miracatfiltrecat(catp,diccat=bibliocats)
slcat=set(lcat)
intersec=scatspag&slcat
if len(intersec)>0:
print u"Categoria redundant",catp,u"amb",intersec,u"a l'article",pag
informe=informe+u"* A [["+pag.title()+u"]] és redundant la [[:"+tcatp+u"]] amb "+formatset(intersec)+u"\n"
else:
print u"Comprovada",catp,u"a l'article",pag
else:
print u"Categoria única"
if comptabloc>250:
fitx=open("categories.txt",'w')
pickle.dump(bibliocats,fitx)
fitx.close()
try:
textnou=textvell+u"\n\n==[[:Categoria:"+origen+u"]]==\n"+informe+u"Tasca en curs.\n"
paginforme.put(textnou,u"Categories redundants a [[:Categoria:"+origen+u"]]")
except EditConflict:
textvell=paginforme.get(force=True)
textnou=textvell+u"\n\n==[[:Categoria:"+origen+u"]]==\n"+informe+u"Tasca en curs.\n"
paginforme.put(textnou,u"Categories redundants a [[:Categoria:"+origen+u"]]")
comptabloc=0
fitx=open("categories.txt",'w')
pickle.dump(bibliocats,fitx)
fitx.close()
try:
textnou=textvell+u"\n\n==[[:Categoria:"+origen+u"]]==\n"+informe+u"Tasca acabada. --~~~~\n"
paginforme.put(textnou,u"Categories redundants a [[:Categoria:"+origen+u"]]")
except EditConflict:
textvell=paginforme.get(force=True)
textnou=textvell+u"\n\n==[[:Categoria:"+origen+u"]]==\n"+informe+u"Tasca acabada. --~~~~\n"
paginforme.put(textnou,u"Categories redundants a [[:Categoria:"+origen+u"]]")
return
#El programa comença aquí
try:
site=wikipedia.getSite('ca')
main()
finally:
wikipedia.stopme()