Code Creatobot
Aller à la navigation
Aller à la recherche
################################# ###### Creatobot #### ################################# import regex as re import requests from urllib.request import urlopen from bs4 import BeautifulSoup user='Creatobot' passw='creatobot_mdp' baseurl='http://wikipast.epfl.ch/wikipast/' summary='Wikipastbot Creatobot' ################################################################################################### ### Initialisations : #ouverture dictionnnaire dictionnaryFileName= 'Lexique381.txt' dictionnaryFile=open(dictionnaryFileName, encoding='utf-8') dictionnaryString=dictionnaryFile.read() dictionnaryLine=dictionnaryString.split('\n') dictionnary = [] for line in dictionnaryLine: dictionnary.append(line.split('\t')[0]) dictionnaryFile.close() #recherche des prénoms francais sur wikipédia response=urlopen("https://fr.wikipedia.org/wiki/Liste_de_pr%C3%A9noms_fran%C3%A7ais_et_de_la_francophonie") page_source=response.read() soupPrenoms=BeautifulSoup(page_source,'html.parser') prenoms=[] for dlTag in soupPrenoms.findAll('dl'): for ddTag in dlTag.findAll('dd'): bTag = ddTag.find('b') if bTag: aTag = bTag.find('a') if aTag: prenoms.append(aTag.string) #Accès aux biographies du wikipast response=urlopen("http://wikipast.epfl.ch/wikipast/index.php/Biographies") page_source=response.read() soupBiographies=BeautifulSoup(page_source,'html.parser') biographies=[] for primitive in soupBiographies.findAll("table"): for cap_and_count in primitive.findAll("td"): for text in cap_and_count.findAll("a"): if text.string != None: biographies.append(text.string) # Login request payload={'action':'query','format':'json','utf8':'','meta':'tokens','type':'login'} r1=requests.post(baseurl + 'api.php', data=payload) #login confirm login_token=r1.json()['query']['tokens']['logintoken'] payload={'action':'login','format':'json','utf8':'','lgname':user,'lgpassword':passw,'lgtoken':login_token} r2=requests.post(baseurl + 'api.php', data=payload, cookies=r1.cookies) #get edit token2 params3='?format=json&action=query&meta=tokens&continue=' r3=requests.get(baseurl + 'api.php' + params3, cookies=r2.cookies) edit_token=r3.json()['query']['tokens']['csrftoken'] edit_cookie=r2.cookies.copy() edit_cookie.update(r3.cookies) ################################################################################################### ### Fonctions : def inDictionnary(word): return word.lower() in dictionnary def inPrenoms(word): return (word.lower()).capitalize() in prenoms def onlyContainLetters(word): return not re.match("^[\D]*$", word) == None def beginWithACapitalLetter(word): return not re.match("^[A-Z](.)*$", word) == None #Si le mot ne contient que des lettres et commence par une majuscule def needBracketsLight(word): return onlyContainLetters(word) and beginWithACapitalLetter(word) #Si le mot ne contient que des lettres, commence par une majuscule et n'est pas dans le dictionnaire ou est un prénom def needBracketsHard(word): return needBracketsLight(word) and (not inDictionnary(word) or inPrenoms(word)) def separatePunctuation(word): punctuationAfter = '' punctuationBefore = '' if re.match('^.+(\p{P}){1,3}$',word): #si on a une ponctuation après un mot punctuationAfter = re.search('[\p{P}]{1,3}$',word).group() word = re.sub('(\p{P}){1,3}$',"", word) if re.match ('^[\w\d_-]{0,1}(\p{P}){1,3}[\w\d_-]+$',word): #si on a une ponctuation avant un mot punctuationBefore = re.search('^[\w\d_-]{0,1}[\p{P}]{1,3}',word).group() word = re.sub('^[\w\d_-]{0,1}[\p{P}]{1,3}',"", word) return [word, punctuationBefore, punctuationAfter] def addBracketsAfter(word): [word, punctuationBefore, punctuationAfter]=separatePunctuation(word) return punctuationBefore+word+']]'+punctuationAfter def addBracketsBefore(word): [word, punctuationBefore, punctuationAfter]=separatePunctuation(word) return punctuationBefore+'[['+word+punctuationAfter def main(*args): pages = "" if len(args) == 0: pages = biographies else: pages = args for p in pages: print(p) #récupération du texte dans la page voulue: title = p result=requests.post(baseurl+'api.php?action=query&titles='+title+'&export&exportnowrap') soup=BeautifulSoup(result.text, "lxml") #prend la partie de la page qui est le texte lines = soup.find('page').find('text').text.split('\n') ### Algorithme : #Prend les groupes de noms composés de 2 noms ou plus. #Il faut que le premier nom ne contienne que des lettres et commence par une majuscule et qu'il soit : soit pas dans le dictionnaire, soit dans la liste des prénoms. #Pour les noms suivants ils doivent simplement ne contenir que des lettres et commencer par une majuscule. newText = '' #Découpage du texte en ligne j=0 while j < len(lines) : line=lines[j] if not re.match('^[=]{1,6}.*[=]{1,6}$', line): #Si la ligne n'est pas un titre #Mise en forme des référence au titre de la page line=line.replace('[['+soup.title.text+']]',soup.title.text) line=line.replace(soup.title.text,'[['+soup.title.text+']]') words = line.split(" ") #Découpage du texte en mot modifyFlag = False #Flag pour la gestion groupe de noms firstWord = False i=0 while i < len(words): #Evitement des mots déjà balisés if re.match('[\[]{2}(.)*', words[i]): #Si présence d'une balise flag = True #Flag pour la gestion des mot déjà balisé wordID = i; while i < len(words)-1 and flag : [wordNoPunc, punctuationBefore, punctuationAfter]=separatePunctuation(words[i]) if i == wordID : if punctuationBefore != '[[' : words[wordID]=re.sub('^[\[]{2}',"", words[wordID]) flag = False i=-1 elif punctuationAfter == ']]' : flag = False elif punctuationAfter != '' : words[wordID]=re.sub('^[\[]{2}',"", words[wordID]) flag = False i=-1 else : if punctuationBefore != '' : words[wordID]=re.sub('^[\[]{2}',"", words[wordID]) flag = False i=-1 elif punctuationAfter == ']]' : flag = False elif punctuationAfter != '' : words[wordID]=re.sub('^[\[]{2}',"", words[wordID]) flag = False i=-1 i+=1 else : [wordNoPunc, punctuationBefore, punctuationAfter]=separatePunctuation(words[i]) if modifyFlag : if firstWord : firstWord=False if needBracketsLight(wordNoPunc) : words[i-1]=addBracketsBefore(words[i-1]) else : modifyFlag=False else : if not needBracketsLight(wordNoPunc) : words[i-1]=addBracketsAfter(words[i-1]) modifyFlag=False #Ouverture des balises si elles ne sont pas déjà ouvertes et si le test est ok elif needBracketsHard(wordNoPunc): modifyFlag = True firstWord = True #Fermeture des balises si dernier mot ou si ponctuation après le mot if modifyFlag and needBracketsLight(wordNoPunc) and (i == len(words)-1 or punctuationAfter != '') : modifyFlag=False if not firstWord : words[i]=addBracketsAfter(words[i]) i+=1 line = ' '.join(words) newText += line + '\n' j+=1 print(newText) payload={'action':'edit','assert':'user','format':'json','utf8':'','text':newText,'summary':summary,'title':title,'token':edit_token} r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie) print(r4.text)