Utilisation d’AngleSharp dans PowerShell 7 pour analyser des pages Web – –

Logo Powershell

AngleSharp est une bibliothèque .NET qui facilite et accélère l’analyse et l’utilisation du contenu HTML. Comme AngleSharp est écrit en .NET, vous pouvez également utiliser et consommer la sortie dans PowerShell. La combinaison de ces deux vous permet de créer rapidement et facilement un script de contenu HTML. Dans cet article, nous allons explorer comment configurer AngleSharp et consommer une page météo, et convertir les données en un objet PowerShell.

Installation et chargement d’AngleSharp

L’installation d’AngleSharp est facile en utilisant le Install-Package commander. Vous pouvez même installer le package dans le CurrentUser scope, ce qui signifie que vous n’avez pas besoin de droits d’administration pour utiliser cette bibliothèque. Le package est contenu dans le NuGet bibliothèque.

Install-Package 'AngleSharp' -Scope 'CurrentUser' -Source 'Nuget'

Ensuite, nous voudrons charger AngleSharp pour une utilisation dans notre script PowerShell. Pour ce faire, nous voudrons utiliser le Add-Type cmdlet pour charger directement la DLL de la bibliothèque. Vous trouverez ci-dessous du code qui aide à localiser la dernière version .NET et à charger ce chemin, si la bibliothèque n’est pas déjà chargée 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

Lisez la suite pour découvrir comment analyser le contenu de la page Web et créer un objet PowerShell utile!

  Comment changer la casse du texte dans PowerPoint

Analyse d’une page Web

Bien sûr, tout cela a pour but d’analyser une page Web. Dans cet exemple, nous allons charger le contenu de Invoke-WebRequest puis en utilisant le résultat, analysez le contenu dans AngleSharp. Nous allons utiliser une prévision locale sur 7 jours du service météorologique national pour extraire des données météorologiques et les convertir en objet. Tout d’abord, récupérons les données météorologiques.

$Request = Invoke-WebRequest -Uri "<https://forecast.weather.gov/MapClick.php?lat=40.48675500000007&lon=-88.99177999999995>"

Les données du site qui nous intéresse se trouvent dans le Content propriété, mais c’est la source HTML complète, ce qui est beaucoup à traiter. Souvent, il est plus facile d’utiliser les outils de développement Chrome pour localiser la section de la source HTML que nous voulons utiliser (F12 dans Chrome pour le site que vous souhaitez inspecter).

La structure HTML de la page météo NWS.

Heureusement, il y a un div conteneur avec une liste non ordonnée que nous pouvons analyser. L’étape suivante consiste à charger réellement le contenu récupéré dans AngleSharp.

$Parser = New-Object AngleSharp.Html.Parser.HtmlParser
$Parsed = $Parser.ParseDocument($Request.Content)

Maintenant que nous avons le contenu analysé disponible dans notre $Parsed variable, nous pouvons commencer à manipuler ces données pour accéder uniquement à la section souhaitée. Très pratique, le site NWS fournit un identifiant uniquement pour cette liste non ordonnée nommée seven-day-forecast-list. Étant donné que chaque ID est unique sur une page HTML, cela facilite le ciblage de la liste. En utilisant le All propriété sur notre contenu analysé, nous pouvons récupérer uniquement l’objet avec l’ID de seven-day-forecast-list.

$ForecastList = $Parsed.All | Where-Object ID -EQ 'seven-day-forecast-list'

Cela se traduira par de nombreuses propriétés différentes, mais nous nous concentrons sur le ChildNodes propriété car elle contiendra chaque li contenant les données dont nous avons besoin. Pour avoir une idée de ce que nous cherchons à cibler dans notre objet, jetons un œil à un individu li. Il existe une poignée d’éléments avec des classes que nous pouvons cibler.

  • period-name – La période de temps relative.
  • short-desc – Une description condensée de la météo.
  • temp temp-high – La température élevée.
  Comment réparer une surchauffe d'un adaptateur secteur sous Windows 10

Structure HTML d’un seul élément tombstone-container.

Vous remarquerez peut-être que le img la balise contient un alt propriété avec beaucoup d’informations utiles. Il est assez facile de trouver la classe à cibler car elle est stockée dans le classname propriété du nœud enfant. Pour cibler le alt élément nous devrons nous appuyer sur une méthode légèrement différente, QuerySelectorAll qui utilise des sélecteurs CSS traditionnels pour faciliter le ciblage complexe.

$ForecastList.ChildNodes | ForEach-Object {
# Retrieve just the content of the tombstone-container div underneath the forecast-tombstone li element.
  $Node = $_.ChildNodes | Where-Object ClassName -EQ 'tombstone-container'

  [PSCustomObject]@{
# Search the child nodes under the tombstone-container and find the element named period-name. Retrieve just the innerHTML which is the text value. This includes a break element, <br> of which we don't need, so replace that with a space instead.
    "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>"," "
# Since we don't have a class to target, on the root node, use the CSS selector p > img which looks for a p element with a child img element. Next, use the Attributes property to find the one named alt and return it's value.
    "Alt"    = $Node.QuerySelectorAll("p > img").Attributes.Where({$_.Name -EQ 'alt'}).Value
  }
}

  Comment désactiver le WiFi sur Linux

Sortie de la page Web analysée à partir d’AngleSharp.

Bien que nous devions parcourir quelques éléments pour arriver à ceux que nous voulons, nous pouvons parcourir la structure du document HTML et arriver à ce dont nous avons besoin. Il peut être un peu difficile de comprendre les structures, mais en fin de compte, AngleSharp crée des objets pour chaque élément DOM. Une fois que vous avez déterminé la meilleure façon de cibler les éléments dont vous avez besoin, extraire le contenu n’est pas difficile.

Conclusion

AngleSharp offre une excellente interface de programmation pour analyser et interagir avec le contenu HTML sur les pages Web. Cela peut ouvrir la porte à l’utilisation de PowerShell pour récupérer du contenu qui pourrait autrement être inaccessible. Prendre ce contenu, le stocker et l’utiliser dans des scripts est extrêmement utile et peut aider les méthodes d’intégration du système!