AngleSharp est une bibliothèque .NET qui simplifie considérablement l’analyse et la manipulation de contenu HTML. Étant donné qu’elle est conçue en .NET, elle peut être exploitée directement dans PowerShell, offrant une synergie pour des scripts HTML efficaces. Cet article explore l’installation d’AngleSharp, la récupération de données d’une page météo et leur transformation en un objet PowerShell structuré.
Installation et Importation d’AngleSharp
L’installation d’AngleSharp se fait aisément via la commande Install-Package
. L’installation peut être effectuée dans la portée CurrentUser
, éliminant le besoin de privilèges administratifs. Le package se trouve dans le répertoire NuGet
.
Install-Package 'AngleSharp' -Scope 'CurrentUser' -Source 'Nuget'
L’étape suivante consiste à importer AngleSharp dans votre script PowerShell. Pour cela, nous utiliserons la cmdlet Add-Type
afin de charger la DLL de la bibliothèque. Le code ci-dessous détecte la dernière version .NET et charge son chemin, dans le cas où la bibliothèque n’est pas déjà active dans votre session.
If ( -Not ([System.Management.Automation.PSTypeName]'AngleSharp.Parser.Html.HtmlParser').Type ) {
$standardAssemblyFullPath = (Get-ChildItem -Filter '*.dll' -Recurse (Split-Path (Get-Package -Name 'AngleSharp').Source)).FullName | Where-Object {$_ -Like "*standard*"} | Select-Object -Last 1
Add-Type -Path $standardAssemblyFullPath -ErrorAction 'SilentlyContinue'
} # Terminate If - Not Loaded
Continuez votre lecture pour apprendre comment décortiquer une page web et créer un objet PowerShell exploitable !
Analyse de Page Web
Le cœur de notre objectif est l’analyse d’une page Web. Nous allons extraire le contenu de la page via Invoke-WebRequest
, puis le soumettre à AngleSharp pour interprétation. Notre exemple utilisera une prévision météo locale sur sept jours du National Weather Service afin d’en extraire des données et de les convertir en objet. Commençons par l’extraction des données.
$Request = Invoke-WebRequest -Uri "<https://forecast.weather.gov/MapClick.php?lat=40.48675500000007&lon=-88.99177999999995>"
Les données pertinentes se trouvent dans la propriété Content
de l’objet retourné, mais il s’agit du code HTML entier, ce qui est trop vaste. Il est souvent plus pratique d’utiliser les outils de développement de Chrome (F12) afin de localiser précisément la portion de code HTML qui nous intéresse.
Structure HTML de la page météo du NWS.
Heureusement, un élément div
contenant une liste non ordonnée peut être exploité. L’étape suivante est le chargement du contenu dans AngleSharp.
$Parser = New-Object AngleSharp.Html.Parser.HtmlParser
$Parsed = $Parser.ParseDocument($Request.Content)
Maintenant que le contenu analysé est disponible dans $Parsed
, nous pouvons le manipuler pour extraire uniquement la partie qui nous est utile. Le site du NWS utilise un identifiant unique seven-day-forecast-list
pour cette liste non ordonnée, ce qui simplifie grandement le ciblage. En utilisant la propriété All
, nous pouvons obtenir uniquement l’objet avec cet identifiant.
$ForecastList = $Parsed.All | Where-Object ID -EQ 'seven-day-forecast-list'
Cette opération retourne un objet avec plusieurs propriétés. Celle qui nous intéresse est ChildNodes
, car elle contient tous les éléments li
avec les données que nous souhaitons. Pour comprendre la structure cible, observons un élément li
individuel. Plusieurs classes permettent le ciblage :
period-name
– La période relative.short-desc
– Une description concise de la météo.temp temp-high
– La température maximale.
Structure HTML d’un élément ‘tombstone-container’.
Notez que l’élément img
possède un attribut alt
avec beaucoup d’informations. La classe peut être retrouvée dans la propriété classname
du nœud enfant. Pour cibler l’attribut alt
, nous utiliserons la méthode QuerySelectorAll
, qui exploite les sélecteurs CSS pour un ciblage plus précis.
$ForecastList.ChildNodes | ForEach-Object {
# Récupère le contenu de l'élément tombstone-container sous l'élément li forecast-tombstone
$Node = $_.ChildNodes | Where-Object ClassName -EQ 'tombstone-container'
[PSCustomObject]@{
# Recherche dans les nœuds enfants de tombstone-container l'élément period-name, puis récupère la valeur HTML interne, en remplaçant la balise <br> par un espace
"Period" = $Node.ChildNodes.Where({ $_.ClassName -EQ 'period-name'}).InnerHTML -Replace "<br>"," "
"Temp" = $Node.ChildNodes.Where({ $_.ClassName -Match 'temp'}).InnerHTML
"Short" = $Node.ChildNodes.Where({ $_.ClassName -EQ 'short-desc'}).InnerHTML -Replace "<br>"," "
# Utilise le sélecteur CSS "p > img" pour trouver l'élément img fils de l'élément p, puis trouve l'attribut "alt" et retourne sa valeur.
"Alt" = $Node.QuerySelectorAll("p > img").Attributes.Where({$_.Name -EQ 'alt'}).Value
}
}
Résultat de l’analyse de la page web avec AngleSharp.
Malgré la structure parfois complexe, AngleSharp transforme chaque élément du DOM en objet, ce qui facilite la navigation. Une fois les éléments ciblés, l’extraction du contenu devient simple.
Conclusion
AngleSharp offre une interface de programmation très performante pour l’analyse et l’interaction avec le contenu HTML de pages web. Cela permet d’exploiter PowerShell pour récupérer des données qui seraient autrement inaccessibles. Le stockage et l’utilisation de ces données dans des scripts est extrêmement précieux pour automatiser des processus et réaliser l’intégration de systèmes.