Scraping
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 :)
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 ;)
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte