Résolue

Scraping

# Résolution d'erreurs # Scraping # HTML

Bonjour.
Je viens d'entamer la partie de la formation concernant le scraping.
Une question sur le premier exercice (vers la 54ème minute).
Pour récupérer le titre des livres, j'ai utilisé la méthode "css.select" sans intégrer de gestion des erreurs...

import requests
from bs4 import BeautifulSoup

response = requests.get(url="https://books.toscrape.com/")

with open("index.html", "w") as f:
    f.write(response.text)

with open("index.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")

def books_title() -> str:
    return "\n".join([attrib["title"] for attrib in soup.css.select(select="article h3 a")])

print(books_title())

Est-ce une bonne façon de faire ou je peux m'exposer à de futures difficultés. Cette méthodes de sélection est-elle souvent utilisée dans le domaine ou devrais-je m'orienter vers la méthode "find_all" comme dans la vidéo ?

Merci et bonne journée/soirée :)

Thibault houdon

Mentor

Salut Edouard !

Oui l'utilisation de css.select est tout à fait valide et couramment utilisée, ça reste une question de préférence, mais souvent je retrouve plutôt select dans les scripts un peu plus avancés que find_all ou find. Il me semble que dans les formations sur le scraping dans d'autres vidéos je montre l'utilisation de select également et je parle des deux façons de faire.

Si je ne me trompe pas d'ailleurs il est possible de faire soup.select directement sans passer par soup.css.select.

Pour la gestion des erreurs là c'est un sujet à part que tu devras gérer que tu utilises find / find_all ou select_one / select.

Ton script avec une gestion des erreurs pourrait ressembler à ça :

import requests
from bs4 import BeautifulSoup

def fetch_page(url: str) -> str:
    try:
        response = requests.get(url)
        response.raise_for_status()  # Ici on s'assure que la requête s'est bien passée
        return response.text
    except requests.exceptions.RequestException as e:
        print(f"Error fetching the URL: {e}")
        return ""

def books_title(html: str) -> str:
    soup = BeautifulSoup(html, "html.parser")
    try:
        titles = [attrib["title"] for attrib in soup.select("article h3 a")]
        return "\n".join(titles)
    except Exception as e:
        print(f"Error parsing the HTML: {e}")
        return ""

html_content = fetch_page("https://books.toscrape.com/")
if html_content:
    print(books_title(html_content))

J'espère que ça répond à ta question, bonne continuation dans le monde du scraping ;)

Bonjour Thibault,

Oui, cela répond à ma question. Merci beaucoup pour ton retour rapide.
Je vais continuer la formation avec motivation :).
Bonne soirée.

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.