Gå til innhold

POWERSHELL: Sliter med å filtrere innhold i string fra HTML


Anbefalte innlegg

Etter mange timer på både youtube og google, oppgaven er utført :D

(Har ikke pyntet noe på koden, Cleare-Variable er bare for lettere feilsøking.

Clear-Variable output

$HtmlAgilityPack_Folder = "C:\Users\Flemming\Documents\PS\Ekstra\HtmlAgilityPack.1.4.6\Net45"
$HtmlAgilityPack_File = "HtmlAgilityPack.dll"
$web = "http://www.pollenvarslingen.no/Forsiden/Varsel.aspx"
$location = "Trøndelag"

# "Østlandet med Oslo"
# "Sørlandet"
# "Rogaland"
# "Hordaland"
# "Sogn og Fjordane"
# "Møre og Romsdal"
# "Indre Østlandet"
# "Sentrale fjellstrøk i Sør-Norge"
# "Trøndelag"
# "Nordland"
# "Troms"
# "Finnmark"

cd $HtmlAgilityPack_Folder
add-type -Path .\$HtmlAgilityPack_File
$doc = New-Object HtmlAgilityPack.HtmlDocument
$doc.LoadHtml((iwr $web).RawContent)
 
$output = $doc.DocumentNode.SelectNodes("//*[@id='forecastTable']//tr[contains(.,'$location')]")



#$output
Write-Host Oversikt over spredning ved $location
Write-Host -------------------------------------
Write-Host Spredning av or i dag: $output.SelectNodes("./td[2]").outerHTML.split('"')[1]
Write-Host Spredning av or i morgen: $output.SelectNodes("./td[3]").outerHTML.split('"')[1]
Write-Host Spredning av hassel i dag: $output.SelectNodes("./td[4]").outerHTML.split('"')[1]
Write-Host Spredning av hassel i morgen: $output.SelectNodes("./td[5]").outerHTML.split('"')[1]
Write-Host Spredning av salix i dag: $output.SelectNodes("./td[6]").outerHTML.split('"')[1]
Write-Host Spredning av salix i morgen: $output.SelectNodes("./td[7]").outerHTML.split('"')[1]
Write-Host Spredning av bjørk i dag: $output.SelectNodes("./td[8]").outerHTML.split('"')[1]
Write-Host Spredning av bjørk i morgen: $output.SelectNodes("./td[9]").outerHTML.split('"')[1]
Write-Host Spredning av gress i dag: $output.SelectNodes("./td[10]").outerHTML.split('"')[1]
Write-Host Spredning av gress i morgen: $output.SelectNodes("./td[11]").outerHTML.split('"')[1]
Write-Host Spredning av burot i dag: $output.SelectNodes("./td[12]").outerHTML.split('"')[1]
Write-Host Spredning av burot i morgen: $output.SelectNodes("./td[13]").outerHTML.split('"')[1]


Ser mye er likt det du gjør, men ikke alt ser jeg, det aller vanskeligste var definnetivt å få TR-en med TD inneholdende lokasjon innenfor.

 

 

Lenke til kommentar
Videoannonse
Annonse

Ser mye er likt det du gjør, men ikke alt ser jeg, det aller vanskeligste var definnetivt å få TR-en med TD inneholdende lokasjon innenfor.

 

Gratulerer!  :grin:

Ja, du var ganske uheldig med hvor knotete HTML koden var laget. Som regel pleier det å være lettere å finne frem, men siden TR elementet i seg selv ikke hadde så mye å by på for å identifisere seg selv (alle TR elementene hadde class=fcRegion).

 

Utenom det så ser koden din veldig fin ut! Det er også bra at du ikke har satt inn mellomrom i koden som har med output å gjøre for at det skal se beint ut (slik jeg gjorde i mitt tidligere eksempel), det er sett på som "bad programming practice".

 

Om det er en ting jeg skal pirke på, så hadde jeg byttet ut;

.outerHTML.split('"')[1]

med

.Attributes["title"].value
# En dag kan.
<td title="Ingen spredning" class="fcValueCell" bgcolor="#FFFFFF">

# forandre seg og bli sende slik ut
<td class="fcValueCell" id="99" title="Ingen spredning"  bgcolor="#FFFFFF">

Utenom det, tommel opp!

 

Neste blir vel å lage en app som rister i lomma når det er fare for spredning?  ;)

Endret av Axxxy
Lenke til kommentar

Vel, det er en grunn til at jeg skal ha denne informasjonen ;)

Skal i stede for å skrive til skjerm sette resultatene til variabler, eller mest sannsynlig, sette tall 1-2-3-4 etter hvor stor spredningen er.

Deretter skal tallet sendes til en virtuell sensor i Domoticz (http://domoticz.com/) med JSON GET som igjen kan sende meg meldinger via Pushover (https://pushover.net/) når det er hensiktsmessig.

 

Men den siste delen har jeg ganske kontroll over da jeg har gjort det før :)
ref https://www.hjemmeautomasjon.no/forums/topic/120-hva-har-du-automatisert-idaghva-har-du-gjort-p%C3%A5-dine-prosjekter-idag/?do=findComment&comment=13041

Lenke til kommentar
  • 2 måneder senere...

Takk for det, selv om koden din ser fint og flott ut tror jeg jeg tar å prøver på å kode ut-hentingen av data selv :)

kopierte dog denne:

$doc.LoadHtml((iwr $url).RawContent)
(Du vet forresten ikke hva iwr som står fremfor $url i ovennevnte kodelinje betyr?

 

 

iwr er et alias for invoke-webrequest.

For å sjekke kan du prøve å kjøre get-alias på kommandoer du er usikker på, f.eks "get-alias iwr" gir output:

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           iwr -> Invoke-WebRequest

Kan også anbefale Visual Studio Code med Powershell utvidelsen for powershell. Sann glede å jobbe med, og en av tingene den har er automatisk hinting for forkortelser.

Eksempelvis:

ewsevBp.gif

Som du ser er det også informasjon om funksjonen når du muser over den.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...