Analyse du contenu HTML avec BeautifulSoup
Lorsque vous travaillez avec des données web, vous rencontrerez souvent des réponses HTML. Pour l'analyse HTML, la bibliothèque BeautifulSoup de Python est un excellent outil. Dans cette étape, nous allons apprendre à extraire des informations des réponses HTML.
Installation de BeautifulSoup
Tout d'abord, installons BeautifulSoup et son analyseur HTML :
pip install beautifulsoup4
Analyse HTML de base
Créons un fichier appelé parse_html.py
pour récupérer et analyser une page web :
import requests
from bs4 import BeautifulSoup
## Make a request to a webpage
url = "https://www.example.com"
response = requests.get(url)
## Check if the request was successful
if response.status_code == 200:
## Parse the HTML content
soup = BeautifulSoup(response.text, 'html.parser')
## Extract the page title
title = soup.title.text
print(f"Page title: {title}")
## Extract all paragraphs
paragraphs = soup.find_all('p')
print(f"\nNumber of paragraphs: {len(paragraphs)}")
## Print the text of the first paragraph
if paragraphs:
print(f"\nFirst paragraph text: {paragraphs[0].text.strip()}")
## Extract all links
links = soup.find_all('a')
print(f"\nNumber of links: {len(links)}")
## Print the href attribute of the first link
if links:
print(f"First link href: {links[0].get('href')}")
else:
print(f"Request failed with status code: {response.status_code}")
Exécutez ce script pour voir comment extraire des informations de base d'une page HTML :
python parse_html.py
Vous devriez voir une sortie affichant le titre de la page, le nombre de paragraphes, le texte du premier paragraphe, le nombre de liens et l'URL du premier lien.
Recherche d'éléments spécifiques
Voyons maintenant comment trouver des éléments spécifiques en utilisant des sélecteurs CSS. Créez un fichier appelé html_selectors.py
:
import requests
from bs4 import BeautifulSoup
## Make a request to a webpage with more complex structure
url = "https://quotes.toscrape.com/"
response = requests.get(url)
## Check if the request was successful
if response.status_code == 200:
## Parse the HTML content
soup = BeautifulSoup(response.text, 'html.parser')
## Find all quote elements
quote_elements = soup.select('.quote')
print(f"Number of quotes found: {len(quote_elements)}")
## Process the first 3 quotes
print("\nFirst 3 quotes:")
for i, quote_element in enumerate(quote_elements[:3], 1):
## Extract the quote text
text = quote_element.select_one('.text').text
## Extract the author
author = quote_element.select_one('.author').text
## Extract the tags
tags = [tag.text for tag in quote_element.select('.tag')]
## Print the information
print(f"\nQuote #{i}")
print(f"Text: {text}")
print(f"Author: {author}")
print(f"Tags: {', '.join(tags)}")
else:
print(f"Request failed with status code: {response.status_code}")
Exécutez ce script pour voir comment utiliser les sélecteurs CSS pour extraire des éléments spécifiques :
python html_selectors.py
Vous devriez voir une sortie affichant des informations sur les trois premières citations, y compris le texte de la citation, l'auteur et les balises.
Construction d'un simple Web Scraper
Assemblons le tout pour construire un simple web scraper qui extrait des données structurées d'une page web. Créez un fichier appelé quotes_scraper.py
:
import requests
from bs4 import BeautifulSoup
import json
import os
def scrape_quotes_page(url):
## Make a request to the webpage
response = requests.get(url)
## Check if the request was successful
if response.status_code != 200:
print(f"Request failed with status code: {response.status_code}")
return None
## Parse the HTML content
soup = BeautifulSoup(response.text, 'html.parser')
## Extract all quotes
quotes = []
for quote_element in soup.select('.quote'):
## Extract the quote text
text = quote_element.select_one('.text').text.strip('"')
## Extract the author
author = quote_element.select_one('.author').text
## Extract the tags
tags = [tag.text for tag in quote_element.select('.tag')]
## Add the quote to our list
quotes.append({
'text': text,
'author': author,
'tags': tags
})
## Check if there's a next page
next_page = soup.select_one('.next a')
next_page_url = None
if next_page:
next_page_url = 'https://quotes.toscrape.com' + next_page['href']
return {
'quotes': quotes,
'next_page': next_page_url
}
## Scrape the first page
result = scrape_quotes_page('https://quotes.toscrape.com/')
if result:
## Print information about the quotes found
quotes = result['quotes']
print(f"Found {len(quotes)} quotes on the first page")
## Print the first 2 quotes
print("\nFirst 2 quotes:")
for i, quote in enumerate(quotes[:2], 1):
print(f"\nQuote #{i}")
print(f"Text: {quote['text']}")
print(f"Author: {quote['author']}")
print(f"Tags: {', '.join(quote['tags'])}")
## Save the quotes to a JSON file
output_dir = '/home/labex/project'
with open(os.path.join(output_dir, 'quotes.json'), 'w') as f:
json.dump(quotes, f, indent=2)
print(f"\nSaved {len(quotes)} quotes to {output_dir}/quotes.json")
## Print information about the next page
if result['next_page']:
print(f"\nNext page URL: {result['next_page']}")
else:
print("\nNo next page available")
Exécutez ce script pour extraire des citations d'un site web :
python quotes_scraper.py
Vous devriez voir une sortie affichant des informations sur les citations trouvées sur la première page, et les citations seront enregistrées dans un fichier JSON appelé quotes.json
.
Vérifiez le fichier JSON pour voir les données structurées :
cat quotes.json
Le fichier doit contenir un tableau JSON d'objets de citation, chacun avec des propriétés de texte, d'auteur et de balises.