Uso de AngleSharp en PowerShell 7 para analizar páginas web – CloudSavvy IT

Logotipo de Powershell

AngleSharp es una biblioteca .NET que hace que analizar y trabajar con contenido HTML sea rápido y fácil. Como AngleSharp está escrito en .NET, también puede usar y consumir la salida en PowerShell. La combinación de estos dos le permite crear secuencias de comandos de contenido HTML de forma rápida y sencilla. En este artículo, exploraremos cómo configurar AngleSharp y consumir una página meteorológica, y convertir los datos en un objeto PowerShell.

Instalación y carga de AngleSharp

Instalar AngleSharp es fácil usando el Install-Package mando. Incluso puede instalar el paquete en el CurrentUser alcance, lo que significa que no necesita derechos administrativos para utilizar esta biblioteca. El paquete está contenido en el NuGet biblioteca.

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

A continuación, querremos cargar AngleSharp para usar en nuestro script de PowerShell. Para hacer esto, querremos usar el Add-Type cmdlet para cargar directamente la DLL para la biblioteca. A continuación se muestra el código que ayuda a localizar la última versión de .NET y cargar esa ruta, si la biblioteca no está cargada en su sesión.

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

¡Siga leyendo para descubrir cómo analizar el contenido de la página web y crear un objeto PowerShell útil!

Analizar una página web

Por supuesto, el objetivo de esto es analizar realmente una página web. En este ejemplo cargaremos el contenido de Invoke-WebRequest y luego, usando el resultado, analice el contenido en AngleSharp. Vamos a utilizar un pronóstico local de 7 días del Servicio Meteorológico Nacional para obtener datos meteorológicos y convertirlos en un objeto. Primero, recuperemos los datos meteorológicos.

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

Los datos del sitio que nos interesa están en el Content propiedad, pero es la fuente HTML completa, que es mucho para procesar. A menudo, es más fácil usar las herramientas de desarrollo de Chrome para localizar la sección de la fuente HTML que queremos usar (F12 en Chrome para el sitio que desea inspeccionar).

La estructura HTML de la página meteorológica del NWS.

Afortunadamente, hay un div contenedor con una lista desordenada que podemos analizar. El siguiente paso es cargar el contenido recuperado en AngleSharp.

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

Ahora que tenemos el contenido analizado disponible en nuestro $Parsed variable, podemos empezar a manipular estos datos para llegar solo a la sección que queremos. Muy convenientemente, el sitio de NWS proporciona una ID solo para esta lista desordenada llamada seven-day-forecast-list. Dado que cada ID es único en una página HTML, esto facilita la orientación de la lista. Utilizando la All propiedad en nuestro contenido analizado, podemos recuperar solo el objeto con el ID de seven-day-forecast-list.

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

Esto resultará en muchas propiedades diferentes, pero estamos enfocados en el ChildNodes propiedad ya que contendrá cada li que contiene los datos que necesitamos. Para tener una idea de lo que buscamos apuntar en nuestro objeto, echemos un vistazo a un individuo li. Hay un puñado de elementos con clases a las que podemos apuntar.

  • period-name – El período de tiempo relativo.
  • short-desc – Una descripción condensada del clima.
  • temp temp-high – La alta temperatura.

Estructura HTML de un único elemento contenedor de desecho.

Puede notar que el img la etiqueta contiene una alt propiedad con mucha información útil. Es bastante fácil encontrar la clase a la que apuntar, ya que está almacenada en el classname propiedad del nodo hijo. Para apuntar al alt elemento tendremos que confiar en un método ligeramente diferente, QuerySelectorAll que utiliza selectores CSS tradicionales para facilitar la segmentación compleja.

$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
  }
}

Salida de la página web analizada de AngleSharp.

Aunque tenemos que iterar sobre algunos elementos para finalmente llegar a los que queremos, podemos recorrer la estructura del documento HTML y llegar a lo que necesitamos. Puede ser un poco complicado entender las estructuras, pero en última instancia, lo que hace AngleSharp es crear objetos para cada elemento DOM. Una vez que descubra la mejor manera de orientar los elementos que necesita, extraer el contenido no es difícil.

Conclusión

AngleSharp ofrece una excelente interfaz programática para analizar e interactuar con contenido HTML en páginas web. Esto puede abrir la puerta al uso de PowerShell para recuperar contenido que de otro modo sería inaccesible. Tomar este contenido, almacenarlo y usarlo en scripts es extremadamente útil y puede ayudar a mejorar los métodos de integración del sistema.

Deja un comentario

En esta web usamos cookies para personalizar tu experiencia de usuario.    Política de cookies
Privacidad