Header Ads

Usando AngleSharp no PowerShell 7 para analisar páginas da web

AngleSharp é uma biblioteca . NET que torna a análise e o trabalho com conteúdo HTML rápido e fácil. Como AngleSharp é escrito em . NET, você também pode usar e consumir a saída no PowerShell. A combinação desses dois permite criar um script de conteúdo HTML de forma rápida e fácil. Neste artigo, vamos explorar como configurar o AngleSharp e consumir uma página de clima e converter os dados em um objeto PowerShell.

Instalando e carregando o AngleSharp

A instalação do AngleSharp é fácil usando o comando Install-Package. Você pode até instalar o pacote no escopo CurrentUser, o que significa que você não precisa de direitos administrativos para usar esta biblioteca. O pacote está contido na biblioteca NuGet.

 Instalar-Pacote 'AngleSharp' -Scope 'CurrentUser' -Fonte 'Nuget' 

Em seguida, queremos carregar o AngleSharp para uso em nosso script PowerShell. Para fazer isso, queremos usar o cmdlet Add-Type para carregar diretamente a DLL para a biblioteca. Abaixo está o código que ajuda a localizar a versão mais recente do . NET e a carregar esse caminho, se a biblioteca ainda não estiver carregada em sua sessão.

 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 

Continue lendo para descobrir como analisar o conteúdo da página da web e criar um objeto PowerShell útil!

Analisando uma página da web

Claro, o objetivo disso é analisar uma página da web. Neste exemplo, carregaremos o conteúdo de Invoke-WebRequest e, em seguida, usando o resultado, analisaremos o conteúdo em AngleSharp. Usaremos uma previsão local de 7 dias do National Weather Service para obter dados meteorológicos e convertê-los em um objeto. Primeiro, vamos recuperar os dados meteorológicos.

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

Os dados do site no qual estamos interessados ​​estão na propriedade Content, mas é o código-fonte HTML completo, o que é muito para processar. Freqüentemente, é mais fácil usar as Ferramentas do desenvolvedor do Chrome para localizar a seção do código-fonte HTML que desejamos usar (F12 no Chrome para o site que você deseja inspecionar).

 

A estrutura HTML da página meteorológica do NWS.

Felizmente, há um contêiner div com uma lista não ordenada que podemos analisar. A próxima etapa é realmente carregar o conteúdo recuperado no AngleSharp.

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

Agora que temos o conteúdo analisado disponível em nossa variável $ Parsed, podemos começar a manipular esses dados para chegar apenas à seção que queremos. Muito convenientemente, o site do NWS fornece uma ID apenas para essa lista não ordenada chamada lista de previsão de sete dias. Como cada ID é único em uma página HTML, isso torna a lista fácil de direcionar. Usando a propriedade All em nosso conteúdo analisado, podemos recuperar apenas o objeto com o ID de lista de previsão de sete dias.

 $ ForecastList = $ Parsed. All | Where-Object ID -EQ 'lista de previsão de sete dias' 

Isso resultará em muitas propriedades diferentes, mas estamos focados na propriedade ChildNodes, pois ela conterá cada li contendo os dados de que precisamos. Para ter uma ideia do que estamos procurando atingir em nosso objeto, vamos dar uma olhada em um li individual. Existem vários elementos com classes que podemos segmentar.

  • nome-período – O período de tempo relativo.
  • short-desc – Uma descrição condensada do clima.
  • temp temp-high – A alta temperatura.

 

Estrutura HTML de um único elemento de contêiner tombstone.

Você pode notar que a tag img contém uma propriedade alt com muitas informações úteis. É muito fácil encontrar a classe de destino, pois ela está armazenada na propriedade classname do nó filho. Para direcionar o elemento alt, teremos que contar com um método ligeiramente diferente, QuerySelectorAll, que usa seletores CSS tradicionais para facilitar a segmentação complexa.

 $ ForecastList. ChildNodes | ForEach-Object {# Recupere apenas o conteúdo do div do contêiner da marca para exclusão abaixo do elemento li da marca para exclusão. $ Node = $ _. ChildNodes | Where-Object ClassName -EQ 'tombstone-container' [PSCustomObject] @ {# Pesquise os nós filhos sob o tombstone-container e encontre o elemento denominado period-name. Recupere apenas o innerHTML, que é o valor do texto. Isso inclui um elemento de quebra, < br > dos quais não precisamos, então substitua por um espaço. "Ponto" = $ 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 -Substituir "< br >", " "# Uma vez que não temos uma classe de destino, no nó raiz, use o seletor CSS p > img que procura um elemento p com um elemento filho img. Em seguida, use a propriedade Attributes para encontrar aquele denominado alt e retornar seu valor. "Alt" = $ Node. QuerySelectorAll ("p > img"). Attributes. Where ({$ _. Name -EQ 'alt'}). Value}} 

 

Saída da página da web analisada a partir do AngleSharp.

Embora tenhamos que iterar alguns elementos para, em última análise, chegar apenas aos que queremos, podemos percorrer a estrutura do documento HTML e obter apenas o que precisamos. Pode ser um pouco complicado entender as estruturas, mas, em última análise, o que AngleSharp está fazendo é criar objetos para cada elemento DOM. Depois de descobrir a melhor maneira de direcionar os elementos de que precisa, extrair o conteúdo não é difícil.

Conclusão

AngleSharp oferece uma excelente interface programática para analisar e interagir com conteúdo HTML em páginas da web. Isso pode abrir a porta para o uso do PowerShell para recuperar conteúdo que, de outra forma, estaria inacessível. Pegar esse conteúdo, armazená-lo e usá-lo em scripts é extremamente útil e pode ajudar nos métodos de integração do sistema!

Nenhum comentário