Code en vrac

Extraction de données: discours politiques

Voici un script (qui fonctionne avec Python 3) qui permet d'extraire tous les discours des candidats aux présidentielles de 2007 et 2012. Ces discours sont stockés sur un serveur du "monde.fr" (minkfluence) et en libre accès.

Les données récupérées sont écrites dans des fichiers pour réutilisation. J'avais en effet écrit ce script pour passer les discours à la moulinette de TXM, logiciel utilisé en analyse quantitative textuelle.

Je le partage ici juste pour l'exemple, des fois que cela puisse inspirer quelqu'un...


# -*- coding:utf8 -*-

import urllib.request
from bs4 import BeautifulSoup
import re
import os
# exemples d'urls où sont stockés les discours
#   http://linkfluence.com/projects/discours/2007/Bayrou-2007-04-25.html
#   http://linkfluence.com/projects/discours/2012/Bayrou-2012-04-16.html
# On liste donc les deux urls racines qui nous intéressent
urls = ['http://linkfluence.com/projects/discours/2007/',
        'http://linkfluence.com/projects/discours/2012/']
# on liste les candidats
candidats = {
  '2007': ["Buffet", "Besancenot", "Schivardi", "Bayrou", "Bove", "Voynet",
           "Villiers", "Royal", "Nihous", "LePen", "Laguiller", "Sarkozy"],
  '2012': ["Joly", "LePen", "Sarkozy", "Melenchon", "Poutou",
       "Arthaud", "Cheminade", "Bayrou", "Dupont", "Hollande"]
    }
fin = '.html' # pour la concaténation "candidat" + "date" + ".html"

# booleen utilisé pour effacer quelques "<" qui résistent à beautifulSoup
sentinelle = False

l = 0

# on boucle sur les urls
for url in urls:
  annee = url.split('/')
  annee = annee[5]
  print("Traitement de l'année  " + annee)
  for i in range(1,6): # les discours ont eu lieu entre janvier et juin
    mois = '-' + '0' + str(i) + '-'
    for j in range(1,32): # on itère au hasard sur chaque jour du mois
      if i == 5:
        if j > 6: break # après le 6 mai des deux années, plus de discours!
      if i == 1 and j < 20: break # et aucun avant le 20 janvier...
      # on cherche s'il existe une page pour chaque candidat
      for candidat in candidats[annee]: 
        if j < 10:      
          jour = '0' + str(j)
          site = url + candidat + '-' + annee + mois + jour
        else: site = url + candidat + '-' + annee + mois + jour
        try:
          html = urllib.request.urlopen(site+fin).read() # une page existe-t-elle
        except:
          try:
    # on gère ici quelques exceptions quand les candidats ont au moins deux discours par jour
            for index in ('a', 'b', 'c', 'd'):
              html = urllib.request.urlopen(site + index + fin).read() 
          except: continue # aucune page trouvée, on continue la boucle
        print('Extraction réussie   ########## ' + str(l) + '  #########  ' + candidat + '_' + annee + '_' + mois + '_' + jour + ' ###############')
        l += 1
        fichier = 'campagne' + annee + '/'
        # on crée le fichier où stocker le discours
        if not os.path.exists(fichier):
          os.makedirs(fichier)
        af = open(fichier + candidat + '_' + annee + '_' + mois + '_' + jour + '.txt', 'w')
        soup = BeautifulSoup(html) # on traite le html avec Beautiful Soup
        dateLieu = soup.find('h2').string
        af.write(dateLieu + '\n')
        texts = soup.find('p') # on récupère chaque paragraphe du discours
        # on écrit dans le fichier, caractère par caractère pour retirer
        #les dernières balises HTML
        #qui subsistent malgré l'utilisation de BeautifulSoup
        for t in str(texts):    
          if t == '<':
            sentinelle = True
            continue
          if sentinelle and t == '>':
            sentinelle = False
            continue        
          if not sentinelle: af.write(t) # on écrit dans le fichier
        af.close()


print(l)