Programmation,  Python

Web Scraping avec Python: Sélectionner des éléments et les mettre dans un fichier

J’ai finalement terminé mon projet sur le web scraping. Celui-ci consiste à sortir les URL pour les lectures du mois. Se servir de ces liens URL pour aller sur les pages web et extraire les lectures en question avec les dates. Finalement, il me fallait ajouter les jours de la semaine aux dates.

Je commencerai par parler de la structure du programme en général, car il y a des principes importants à respecter. Puis, Je vais expliquer les lignes de code et les blocs du code qui m’ont posé des défis. Je laisserai le côté débuggage pour un autre poste, car trouver les méthodes efficaces pour débugger s’avérait tout un apprentissage en soi.

Structure du programme

Ne pas répéter le code est une leçon importante que j’ai apprise à l’école. Steve McConnel l’a secondé. Voilà pourquoi, on fait appel à des fonctions lorsqu’on doit répéter la même tâche. Autre leçon importante de McConnel. 1 Une fonction doit faire une seule chose. La régle: Si on a la difficulté à décrire exactement ce que la fonction fait, cela veut dire que la fonction essaie d’en faire trop.

Une note importante par rapport aux fonctions. Faut savoir quel type de variable qu’on envoie à la fonction et quel type de variable la fonction retourne. En python, c’est facile de négliger cette pratique, car on ne déclare pas le type de la variable lorsqu’on la crée. J’ai payé cher pour cet oublie. Voici des exemples.

J’ai essayé d’utiliser les expressions régulières dans le poste «Regex 2e partie: lire un fichier et écrire à un fichier» dans ce programme. D’abord, celle-ci n’a pas marché car les regex n’analysent que les types string. Or, la variable que j’envoyais à la regex est du type Beautiful Soup.

En conséquence, j’ai converti la variable en string en me disant que cela allais régler le problème. Sauf que si la date était le 24 février, la regex correspondait au 4 février, 14 février et 24 février. Je n’avais pas ce problème avec la regex dans le poste «Regex 2e partie: lire un fichier et écrire à un fichier». Dans le but de régler ce problème, j’ai changé le string de recherche à «’4février 2019’». ‘». Cela n’a pas marché non plus. Voir code pour le savoir:

#tutorial vidéo à https://www.youtube.com/results?search_query=python+programming+tutorial+-+27+-+how+to+build+a+web+crawler+%283%2F3%29

#Écrire et ajouter à un fichier Mathes p. 199.
#Schafer montre où placer le code pour ajouter à un fichier.

import re
from bs4 import BeautifulSoup
import urllib.request
url = 'https://www.aelf.org/calendrier/romain/2019/02'
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
html = urllib.request.urlopen(req).read()
  
"""Reçoit: url de lecture du jour +
    Retourne: le texte qui contient les lectures avec la date"""
def chercher_texte_dans_lien(lien_du_messe):
    url_lecture = lien_du_messe
    req_lecture = urllib.request.Request(url_lecture, headers={'User-Agent': 'Mozilla/5.0'})
    html_lecture = urllib.request.urlopen(req_lecture).read()
    return(html_lecture)

"""Reçoit: url de lecture du jour +
    Retourne: la date"""
def chercher_date_du_jour(texte_de_messe):
    soup_lecture = BeautifulSoup(texte_de_messe, 'html.parser')
    date = soup_lecture.find('h4', class_='date')
    return(date)

"""Reçoit: url de lecture du jour +
    Retourne: le texte du jour"""
def chercher_texte_du_jour(texte_de_messe):
    soup_lecture = BeautifulSoup(texte_de_messe, 'html.parser')

    texte_complet_liste = [] #créer une liste qui contiendra le texte
    for texte in soup_lecture.find_all('div', {'id':re.compile('messe1_lecture[0-9]')}):  #Voire Mitchell, faut noter tous les éléments texte_complet_liste.append(texte) #Ajouter les lectures du jour. Voire «List append() in for loop [duplicate]» \ https://stackoverflow.com/questions/41452819/list-append-in-for-loop #Convertir la liste dans un seul string #«Python map() function» https://www.journaldev.com/22960/python-map-function return("".join(map(str, texte_complet_liste))) """Regex pour ajouter le jour de la semaine à la date.""" """Reçoit la date sans jour de la semaine + Retourne: la date avec le jour de la semaine"""
        texte_complet_liste.append(texte)
    return("".join(map(str, texte_complet_liste)))

def ajouter_jour_de_la_semaine(date_sans_jour):
    pattern1 = re.compile(r'(<h4 class="date">(1 février 2019)</h4>|<h4 class="date">(8  février 2019)</h4>|<h4 class="date">(15 février 2019)</h4>|<h4 class="date">(22 février 2019)</h4>|<h4 class="date">(28 février 2019)</h4>)') 
    pattern2 = re.compile(r'(<h4 class="date">(2 février 2019)</h4>|<h4 class="date">(9 février 2019)</h4>|<h4 class="date">(16 février 2019)</h4>|<h4 class="date">(23 février 2019)</h4>|<h4 class="date">(30 février 2019)</h4>)')
    pattern3 = re.compile(r'(<h4 class="date">(3 février 2019)</h4>|<h4 class="date">(10 février 2019)</h4>|<h4 class="date">(17 février 2019)</h4>|<h4 class="date">(24 février 2019)</h4>|<h4 class="date">(31 février 2019)</h4>)') 
    pattern4 = re.compile(r'(<h4 class="date">(4 février 2019)</h4>|<h4 class="date">(11 février 2019)</h4>|<h4 class="date">(18 février 2019)</h4>|<h4 class="date">(25 février 2019)</h4>)') 
    pattern5 = re.compile(r'(<h4 class="date">(5 février 2019)</h4>|<h4 class="date">(12 février 2019)</h4>|<h4 class="date">(19 février 2019)</h4>|<h4 class="date">(26 février 2019)</h4>)')
    pattern6 = re.compile(r'(<h4 class="date">(6 février 2019)</h4>|<h4 class="date">(13 février 2019)</h4>|<h4 class="date">(20 février 2019)</h4>|<h4 class="date">(27 février 2019)</h4>)')
    pattern7 = re.compile(r'(<h4 class="date">(7 février 2019)</h4>|<h4 class="date">(14 février 2019)</h4>|<h4 class="date">(21 février 2019)</h4>|<h4 class="date">(28 février 2019)</h4>)')

    if pattern1 in date_sans_jour:  #Python - Basic Operators https://www.tutorialspoint.com/python/python_basic_operators.htm
        return(pattern1.sub(r'<p>vendredi \1</p>', date_sans_jour))
    elif pattern2 in date_sans_jour:
        return(pattern2.sub(r'samedi \1', date_sans_jour))
    elif pattern3 in date_sans_jour:
        return(pattern3.sub(r'dimanche \1', date_sans_jour))
        
    else:
        assert "une erreur voir automate the boring stuff"
        #remplacer4 = pattern4.sub(r' lundi \1', remplacer3)
        #remplacer5 = pattern5.sub(r' mardi \1', remplacer4)
        #remplacer6 = pattern6.sub(r' mercredi \1', remplacer5)
        #remplacer7 = pattern7.sub(r'jeudi \1', lf_contents)

"""Reçoit: texte à ajouter au fichier +
    Retourne: rien"""
def ajouter_texte_fichier(texte_ajouter):
    with open('messes_du_jour.html', 'a') as af:     
       # print(type(texte_ajouter)) # Pour savoir le type de variable       
        af.write(str(texte_ajouter))

if __name__ == "__main__":
    #Python 3.4 urllib.request error (http 403) https://stackoverflow.com/questions/28396036/python-3-4-urllib-request-error-http-403
    """Extraire les liens sur la page du mois"""
    with open('liens_lectures_du_mois.txt', 'a') as af:
             
#        source_code = requests.get(url)
#        source_code.raise_for_status()
#        plain_text = source_code.text
        #soup = BeautifulSoup(plain_text, 'html.parser')
        soup = BeautifulSoup(html, 'html.parser')
        lectures_tous = soup.find(id='right-col', \
                        class_='block-single-reading without-toolbar')
        #print(lectures_tous.prettify())
        for lectures_ligne in lectures_tous.find_all('div', class_='row m-b-10'):
            #print(lectures_ligne.prettify())
            #lectures_messe_et_heures = lectures_ligne.find('div', class_='col-sm-3')
            #print(lectures_messe_et_heures)
            lectures_messes = lectures_ligne.find('a', title='Accéder aux messes')
            href = "https://www.aelf.org" + lectures_messes.get('href')
            af.write(href + "\n")
            
    with open('liens_lectures_du_mois.txt', 'r') as lf:
        """Pour chacun des lignes dans le fichier, on effectue des opérations"""
        for ligne in lf:
            """Mettre le texte du liens dans un variable"""
            lecture_texte = chercher_texte_dans_lien(ligne)
        
            """Extraire la date de la page web"""
            date_du_jour = chercher_date_du_jour(lecture_texte)
       
            """Ajouter le jour de la semaine à la date"""
            date_avec_jour = ajouter_jour_de_la_semaine(date_du_jour)
            print(date_avec_jour)
            ajouter_texte_fichier(date_avec_jour)

            """Extraire le texte de la page web"""
            texte_du_jour = chercher_texte_du_jour(lecture_texte)
            ajouter_texte_fichier(texte_du_jour)

#    with open('outfile', 'w') as ef:
#        ef.write(remplacer7)
#        #explications https://stackoverflow.com/questions/18703525/attributeerror-str-object-has-no-attribute-write
#        #remplacer7.write()
#        print('"ef" est du type: ', type(ef))
        #for link in lectures_liste:
            #lecture_mess_du_jour = 
            #href = "https://www.aelf.org" + link.get('href')
            
    #Créer un fonction qui cherche le text désiré. Schafer montre comment faire.
    #Ajouter le text désiré au fichier.         
            #ouvrir_onglets_dans_navigateur(href)
            # chercher_text_dans_url(href)
            
    #Faire appelle au regex qui ajoute le jour de la semaine.         

    #def ouvrir_onglets_dans_navigateur(url):
       # """ouvrir les onglets dans la navigator"""

       # webbrowser.open_new_tab(url)
##What is the perfect counterpart in Python for “while not EOF” https://stackoverflow.com/questions/15599639/what-is-the-perfect-counterpart-in-python-for-while-not-eof    
#    with open('liens_lectures_du_mois.txt') as lf:
#        while True:
#            #Problème est dans la boucle while
#            ligne = lf.readline()
#            print(ligne)
#            if "FIN" in ligne:
#                print('Terminé')
#                break
#            else:
#                date_du_jour = chercher_date_du_jour(ligne)
        #        print(date_du_jour)
        #            ajouter_texte_fichier(date_du_jour)
        #            texte_du_jour = chercher_texte_du_jour()
        #            ajouter_texte_fichier(texte_du_jour)
                #print(ligne, end='')
#                print(date_du_jour, end='')

À partir de ce moment, je suis arrivé à la conclusion que je devrai trouver une façon plus simple d’ajouter le jour de la semaine à la date. Après avoir consulté le livre «Automate the boring stuff»2 je suis arrivé à la conclusion qu’une liste répondait très bien à mes besoins. Voici le programme avec une liste:

#tutorial vidéo à https://www.youtube.com/results?search_query=python+programming+tutorial+-+27+-+how+to+build+a+web+crawler+%283%2F3%29

#Écrire et ajouter à un fichier Mathes p. 199.
#Schafer montre où placer le code pour ajouter à un fichier.

from bs4 import BeautifulSoup
import logging
#logging.basicConfig(filename='test.log', level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
import re 
import urllib.request

# create logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter('%(asctime)s:%(name)s:%(message)s')

file_handler = logging.FileHandler('sample.log', mode='w')
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)

# create console handler and set format
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
stream_handler.setLevel(logging.CRITICAL)

logger.addHandler(file_handler)
logger.addHandler(stream_handler)

logger.debug('Début du programme')

url = 'https://www.aelf.org/calendrier/romain/2019/04'
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
html = urllib.request.urlopen(req).read()
  
"""Reçoit: url de lecture du jour +
    Retourne type string:  le texte qui contient les lectures avec la date"""
def chercher_texte_dans_lien(lien_du_messe):
    logger.debug('Début de chercher texte dans un lien')
    url_lecture = lien_du_messe
    req_lecture = urllib.request.Request(url_lecture, headers={'User-Agent': 'Mozilla/5.0'})
    html_lecture = urllib.request.urlopen(req_lecture).read()
    #print('html_lecture est du type: ', type(html_lecture))
    
    #logger.debug('Le texte de lecture est: ' + str(html_lecture))
    
    logger.debug('Fin de chercher texte dans un lien')
    return(html_lecture)
    
"""Reçoit: url de lecture du jour +
    Retourne: Objet du type BeautifulSoup avec la date et balises html"""
def chercher_date_du_jour(texte_de_messe):
    
    logger.debug('Début de chercher_date_du_jour')
    soup_lecture = BeautifulSoup(texte_de_messe, 'html.parser')
    date = soup_lecture.find('h4', class_='date')
    #print('Variable date est du type: ', type(date))
    logger.debug('Date est du type: ' +  str(type(date)) + 'Voici la date: ' + str(date))
    logger.debug('Fin de chercher_date_du_jour')
    return(date)

"""Reçoit: url de lecture du jour +
    Retourne: string. Le texte du jour"""
def chercher_texte_du_jour(texte_de_messe):
    logger.debug('Début de texte du jour')
    logger.debug(f"Texte de la messe est: {texte_de_messe}")
    soup_lecture = BeautifulSoup(texte_de_messe, 'html.parser')
    texte_complet_liste = [] #créer une liste  qui contiendra le texte

    for texte in soup_lecture.find_all('div', {'id':re.compile('messe1_lecture[0-9]')}):  #Voire Mitchell, faut noter tous les éléments texte_complet_liste.append(texte) 
        #Ajouter les lectures du jour. Voire «List append() in for loop [duplicate]» \ https://stackoverflow.com/questions/41452819/list-append-in-for-loop 
        #Convertir la liste dans un seul string 
        #«Python map() function» https://www.journaldev.com/22960/python-map-function 
        texte_complet_liste.append(texte)
    logger.debug(f'Le texte du jour est: {texte_complet_liste}')
    logger.debug('Fin de texte du jour')
    return("".join(map(str, texte_complet_liste)))

"""Enlever balises html +
Reçoit: objet du type BeautifulSoup. Date avec balises html +
Retourne: objet BeautifulSoup qui contient la date sans balises"""
def enlever_balises_html(date_du_jour_avec_balises):
    logger.debug("Début d'enlever les balises html")
    logger.debug(f"date_du_jour_avec_balises est du type: {date_du_jour_avec_balises}")
    logger.debug("Fin d'enlever les balises html")
    return(date_du_jour_avec_balises.get_text())
        
"""Ajouter le jour de la semaine à la date.""" 
"""Reçoit: Objet BeautifulSoup avec la date sans jour de la semaine + 
Retourne: string qui contient la date avec le jour de la semaine"""
def ajouter_jour_de_la_semaine(date_sans_jour):
    logger.debug("Début d'ajouter jour de la semaine")
    pattern1 = ('<h4 class="date">1 avril 2019</h4>', '<h4 class="date">8 avril 2019</h4>', '<h4 class="date">15 avril 2019</h4>', '<h4 class="date">22 avril 2019</h4>', '<h4 class="date">29 avril 2019</h4>') 
    pattern2 = ('<h4 class="date">2 avril 2019</h4>', '<h4 class="date">9 avril 2019</h4>', '<h4 class="date">16 avril 2019</h4>', '<h4 class="date">23 avril 2019</h4>', '<h4 class="date">30 avril 2019</h4>')
    pattern3 = ('<h4 class="date">3 avril 2019</h4>', '<h4 class="date">10 avril 2019</h4>', '<h4 class="date">17 avril 2019</h4>', '<h4 class="date">24 avril 2019</h4>', '<h4 class="date">31 avril 2019</h4>') 
    pattern4 = ('<h4 class="date">4 avril 2019</h4>', '<h4 class="date">11 avril 2019</h4>', '<h4 class="date">18 avril 2019</h4>', '<h4 class="date">25 avril 2019</h4>') 
    pattern5 = ('<h4 class="date">5 avril 2019</h4>', '<h4 class="date">12 avril 2019</h4>', '<h4 class="date">19 avril 2019</h4>', '<h4 class="date">26 avril 2019</h4>')
    pattern6 = ('<h4 class="date">6 avril 2019</h4>', '<h4 class="date">13 avril 2019</h4>', '<h4 class="date">20 avril 2019</h4>', '<h4 class="date">27 avril 2019</h4>')
    pattern7 = ('<h4 class="date">7 avril 2019</h4>', '<h4 class="date">14 avril 2019</h4>', '<h4 class="date">21 avril 2019</h4>', '<h4 class="date">28 avril 2019</h4>')
    
    logger.debug(f"Date sans jour est: {date_sans_jour}")

    if str(date_sans_jour) in pattern1:
        date_du_jour_sans_balises = enlever_balises_html(date_sans_jour)
        return"<p>le lundi " + str(date_du_jour_sans_balises) + "</p>"

    elif str(date_sans_jour) in pattern2:
        date_du_jour_sans_balises = enlever_balises_html(date_sans_jour)
        return"<p>le mardi " + str(date_du_jour_sans_balises) + "</p>"

    elif str(date_sans_jour) in pattern3:
        date_du_jour_sans_balises = enlever_balises_html(date_sans_jour)
        return"<p>le mercredi " + str(date_du_jour_sans_balises) + "</p>"

    elif str(date_sans_jour) in pattern4:
        date_du_jour_sans_balises = enlever_balises_html(date_sans_jour)
        return"<p>le jeudi " + str(date_du_jour_sans_balises) + "</p>"

    elif str(date_sans_jour) in pattern5:
        date_du_jour_sans_balises = enlever_balises_html(date_sans_jour)
        return"<p>le vendredi " + str(date_du_jour_sans_balises) + "</p>"

    elif str(date_sans_jour) in pattern6:
        date_du_jour_sans_balises = enlever_balises_html(date_sans_jour)
        return"<p>le samedi " + str(date_du_jour_sans_balises) + "</p>"
    
    elif str(date_sans_jour) in pattern7:
        date_du_jour_sans_balises = enlever_balises_html(date_sans_jour)
        return"<p>le dimanche " + str(date_du_jour_sans_balises) + "</p>"

    else:
        logger.exception("Ajouter jour de la semaine n'a pas marché")
        raise Exception("Ajouter jour de la semaine n'a pas marché.")
    logger.debug("Fin d'ajouter jour de le semaine")

"""Reçoit: string. Texte à ajouter au fichier +
    Retourne: rien. Écrit le text au fichier avec balises html."""
def ajouter_texte_fichier(texte_ajouter):
    logger.debug("Début ajouter texte")
    with open('messes_du_jour.html', 'a') as af:     
        logger.debug(f"Texte à ajouter est du type: {type(texte_ajouter)}") # Pour savoir le type de variable       
        af.write(str(texte_ajouter))
    logger.debug("Fin ajouter texte")

if __name__ == "__main__":
    #Python 3.4 urllib.request error (http 403) https://stackoverflow.com/questions/28396036/python-3-4-urllib-request-error-http-403
    """Extraire les liens sur la page du mois"""
    
    logger.debug("Début d'extraction des liens URL")
    with open('liens_lectures_du_mois.txt', 'a') as af:        
#        source_code = requests.get(url)
#        source_code.raise_for_status()
#        plain_text = source_code.text
        #soup = BeautifulSoup(plain_text, 'html.parser')
        soup = BeautifulSoup(html, 'html.parser')
        lectures_tous = soup.find(id='right-col', \
                        class_='block-single-reading without-toolbar')
        #print(lectures_tous.prettify())
        for lectures_ligne in lectures_tous.find_all('div', class_='row m-b-10'):
            #print(lectures_ligne.prettify())
            #lectures_messe_et_heures = lectures_ligne.find('div', class_='col-sm-3')
            #print(lectures_messe_et_heures)
            lectures_messes = lectures_ligne.find('a', title='Accéder aux messes')
            href = "https://www.aelf.org" + lectures_messes.get('href')
            
            logger.debug("Début d'extraction des lieuns URL")
            logger.debug("Lien URL pour la lecture est: " + href)
            af.write(href + "\n")
            logger.debug("Fin d'extraction des liens URL")

with open('liens_lectures_du_mois.txt', 'r') as lf:
    """Pour chacun des lignes dans le fichier, on effectue des opérations"""
    for ligne in lf:
        """Mettre le texte du liens dans un variable"""
        url_texte_complet = chercher_texte_dans_lien(ligne)
        
        """Extraire la date de la page web"""
        logger.debug("Début d'extraire la date de la page web.")
        date_du_jour = chercher_date_du_jour(url_texte_complet)
        logger.debug(f"'date_du_jour' est du type: {type(date_du_jour)}. Voici la date {str(date_du_jour)}")
        logger.debug("Fin d'extraire la date de la page web.")
        
        """Ajouter le jour de la semaine à la date"""
        logger.debug("Début d'ajouter jour de la semaine")
        logger.debug(f"Date du jour est: {date_du_jour}. Elle est du type: {type(date_du_jour)}")
        date_avec_jour = ajouter_jour_de_la_semaine(date_du_jour)
        logger.debug(f'Date avec jour est du type {str(type(date_avec_jour))}. Voici la date {str(date_avec_jour)}.')
        ajouter_texte_fichier(date_avec_jour)
        logger.debug("Fin d'ajouter jour de la semaine")

        """Extraire le texte de la page web"""
        texte_du_jour = chercher_texte_du_jour(url_texte_complet)
        ajouter_texte_fichier(texte_du_jour)
#    with open('outfile', 'w') as ef:
#        ef.write(remplacer7)
#        #explications https://stackoverflow.com/questions/18703525/attributeerror-str-object-has-no-attribute-write
#        #remplacer7.write()
#        print('"ef" est du type: ', type(ef))
        
            
    #Créer un fonction qui cherche le text désiré. Schafer montre comment faire.
    #Ajouter le text désiré au fichier.         
            #ouvrir_onglets_dans_navigateur(href)
            # chercher_text_dans_url(href)
            
    #Faire appelle au regex qui ajoute le jour de la semaine.         

    #def ouvrir_onglets_dans_navigateur(url):
       # """ouvrir les onglets dans la navigator"""

       # webbrowser.open_new_tab(url)
##What is the perfect counterpart in Python for “while not EOF” https://stackoverflow.com/questions/15599639/what-is-the-perfect-counterpart-in-python-for-while-not-eof    
#    with open('liens_lectures_du_mois.txt') as lf:
#        while True:
#            #Problème est dans la boucle while
#            ligne = lf.readline()
#            print(ligne)
#            if "FIN" in ligne:
#                print('Terminé')
#                break
#            else:
#                date_du_jour = chercher_date_du_jour(ligne)
        #        print(date_du_jour)
        #            ajouter_texte_fichier(date_du_jour)
        #            texte_du_jour = chercher_texte_du_jour()
        #            ajouter_texte_fichier(texte_du_jour)
                #print(ligne, end='')
#                print(date_du_jour, end='')
            
logger.debug('Fin du programme')

Les méthodes join() et map()

La ligne 82 return(«  ».join(map(str, texte_complet_liste))) m’a posé un défi pour deux raisons. D’abord, il me fallait apprendre sa nécessité. Ensuite, apprendre comment les deux fonctions «join» et «map» travaillent ensemble. Je m’explique.

Au début j’essayais simplement d’ajouter du texte à une variable du type string. Mais ça n’a pas marché. Pourquoi? Parce qu’on ne peut ajouter une chaîne à une variable du type string. Il nous faut créer une autre variable qui contient les deux chaînes. Cela est trop compliqué et c’est pourquoi je suis arrivé à la conclusion que j’avais besoin d’une liste ou un tuple, car c’est facile d’ajouter des objets à une liste et un tuple.

Regardons le code à partir de la ligne 79. La méthode «append» ajoute les lecteurs dans la liste «texte_complet_liste» et celles-ci sont du type Beautiful Soupe. Je veux enchaîner ses lectures et les envoyer dans le fichier texte. La méthode join() prend des chaînes du type itératif (Listes, tuples, chaînes, dictionnaires, ensembles) et les enchaîne et elle retourne une chaîne. Cependant, il faut convertir les objets du type Beautiful Soupe en chaînes avant d’appliquer la méthode join(). La méthode map() sert à faire la conversion, car celle-ci applique la méthode string sur la liste. La syntaxe est map(fonction, liste). La méthode map() s’appique à des objets itératifs comme la méthode join().

Finalement, il y a beaucoup de commentaires dans ce programme. J’ai pris des notes et des références pour m’aider à comprendre. La boucle «while» dans les commentaires sert de faire la même chose que la boucle «for». Pour fins d’apprentissage je voulais appliquer deux méthodes différentes pour atteindre le même but. J’expliquerai les logs dans une autre blog sur le débogage.

Vous trouverez le code pour ces programmes sur Github à https://github.com/srqty/web_scraping_lectures_messe.git Le premier s’intitule «buckys_web_crawler_regex.py» et le deuxième «messe_web_crawler_V2.py»

  1. «Code Complete: A Practical Handbook of Software Construction, Second Edition, Steve McCONNELL
  2. «Automate the Boring Stuff with Python: Practical Programming for Total Beginners» d’Al SWEIGART

Programmation, science de données et marketing

2 commentaires