Petit script que j'utilise pour mettre à jour Wikipédia:Maintenance des bandeaux. Je le fais tourner sur mac, il faudra prévoir quelques adaptation pour le faire fonctionner sur une autre machine.


#  *-* coding: mac_roman *-*
#  open a webpage (from PythonWikipediaBot)
#
import urllib, re, sets

class MyURLopener(urllib.FancyURLopener):
    version="PythonWikipediaBot/1.0"


def getUrl( url):
        uo = MyURLopener()
        f = uo.open(url)
        text = f.read()
        # Find charset in the content-type meta tag
        contentType = f.info()['Content-Type']
        R = re.compile('charset=([^\'\"]+)')
        m = R.search(contentType)
        if m:
            charset = m.group(1)
        else:
            print "WARNING: No character set found"
            # UTF-8 as default
            charset = 'utf-8'
        # Convert HTML to Unicode
        try:
            text = unicode(text, charset, errors = 'strict')
        except UnicodeDecodeError, e:
            print e
            print (u'ERROR: Invalid characters found on %s, replaced by \\ufffd.' % url) 
            # We use error='replace' in case of bad encoding.
            text = unicode(text, charset, errors = 'replace')
        return text
      

#
#  parse li tags
#
import HTMLParser
class liParser (HTMLParser.HTMLParser):
    def reset( self ):
        self.curLine = []
        self.result = []
        self.li = False
        HTMLParser.HTMLParser.reset(self)
    def handle_starttag(self, tag, attrs):
        if tag=="li":
            self.li = True
    def handle_endtag(self, tag,):
        if tag=="li":
            self.li = False
            if self.curLine:
                self.result.append(u"".join(self.curLine ))
                self.curLine = []
    def handle_data(self, 	data):
        if self.li:
            self.curLine.append(data)

#
# remove non-encyclopedic namespaces
#
def clearNamespaces(lines):
    removable = (u"Wikip\xe9dia:", u"Utilisateur:", u"Discuter:", u"Discussion Mod\xe8le:", 
		 u"Mod\xe8le:",  u"Aide:",  u"Cat\xe9gorie:",  
                 u"Discussion Utilisateur:",  u"Discussion Wikip\xe9dia:")
    result = []
    
    for l in lines:
        append = True
        for tag in removable:
            if l.startswith(tag):
                append = False
                break
        if append:
            if l.endswith("(inclusion) "):
                l = l[:-13]
            result.append(l)
    return result





#
#  return  the  articles wich are lised since more than n days
#

import time,pickle
def compare_old (data, old_path, days):
    # read old articles
    olds = {}
    try:
        f = open(old_path)
    except IOError:
        pass
    else:
        olds = pickle.load(f)
        f.close()
    
    now = time.time() / (24*60*60)
    
    reolds = {}
    result = sets.Set()
    
    for x in data:
        try:
            date = olds[x]
            if now-date>days:
                result.add(x)
        except KeyError:
            date = now
        reolds[x]=date
    
    f = open(old_path, "w")
    pickle.dump(reolds, f)
 
    result = list(result)
    result.sort()
    return result



#
# 
#

import os,tempfile 

def list_link(output, target, old_path, days, header):
    url = url = "http://fr.wikipedia.org/w/index.php?title=Special:Whatlinkshere/%s&limit=900&from=0"%target
    txt = getUrl(url)
    
    start = txt.index("<!-- start content -->")
    end = txt.index("<!-- end content -->")
    txt = txt[start:end]
    #print repr(txt)
    parser = liParser()
    parser.feed(txt)
    result =  clearNamespaces(parser.result)
    #print result
    result = compare_old(result, old_path, days)
    print result
    if result:
 
        output.write(header.encode('utf_16'))
        for i in result:
            line = u"* [[:"+i+u"]]\n"
            output.write(line.encode('utf_16'))
 
    return result


#
# 
#
f,path = tempfile.mkstemp( ".txt", "")
f = os.fdopen(f, "w")



header_wikt =  u"""
==Wiktionnaire==
''Cette section liste les articles possédant un bandeau "pour wiktionnaire" depuis plus d'une semaine. 
Vous êtes invités à faire ce transfert au plus tôt.''

"""
list_link(f, "Mod%C3%A8le:Pour_Wiktionnaire", "./pour_wikt", 7, header_wikt)



header_wikisource =  u"""
==Wikisource==
''Cette section liste les articles possédant un bandeau "pour wikisource" depuis plus d'une semaine. 
Vous êtes invités à faire ce transfert au plus tôt.''

"""
list_link(f, "Mod%C3%A8le:Pour_Wikisource", "./pour_wikisource", 7, header_wikisource)


header_supression = u"""
==Pages à supprimer==
''Cette section liste les articles possédant un bandeau "supprimer" depuis plus d'un mois. 
La page devrait être effacées par un administrateur ou le bandeau devrait être retiré.''
"""
list_link(f, "Mod%C3%A8le%3ASuppression", "./supression", 30, header_supression)


header_supimg = u"""
==Images à supprimer==
''Cette section liste les images possédant un bandeau "suppression images" depuis plus d'un mois. 
L'image devrait être effacées par un administrateur ou le bandeau devrait être retiré.''
"""
list_link(f, "Mod%C3%A8le:Suppression_image", "./supimg", 30, header_supimg)

header_licence = u"""

==Images avec un problème de licence==
''Cette section liste les images possédant un bandeau "licence inconnue" depuis plus d'un mois. 
L'image devrait être effacées par un administrateur ou le bandeau devrait être retiré.''
"""
list_link(f, "Mod%C3%A8le:Licence_inconnue", "./lienceimg", 30, header_licence)

header_copie_site = u"""
==Copie de site==
''Cette section liste les articles possédant un bandeau "copie de site" depuis plus d'une semaine. 
Elles vont être effacées par un administrateur si aucune autorisation n'a été fournie.''

"""
list_link(f, "Mod%C3%A8le%3ACopie_de_site", "./copie_site", 7, header_copie_site)


header_copyright = u"""

==Copyright==
''Cette section liste les articles possédant un bandeau "copie à vérifier" depuis plus d'une semaine. 
Elles devraient être proposées sur [[Wikipédia:Pages à supprimer]] si aucune autorisation n'a été fournie.''

"""
list_link(f, "Mod%C3%A8le:Copie_%C3%A0_v%C3%A9rifier", "./copyright", 7, header_copyright)
## TODO faire un outil pour lister automatiquement les pages sur [[Wikipédia:Pages à supprimer]] ? 

f.close()
os.system("open "+path)