Gå til innhold

POWERSHELL: Sliter med å filtrere innhold i string fra HTML


Anbefalte innlegg

Har filtrert litt på innholder jeg har entet fra Invoke-WebRequest og greid å få frem innholdet i en spesifikk DIV-tagg.

Innholdet er lagret i $forecast og lyder slik:

<TABLE cellSpacing=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=fcTableCorner rowSpan=2> </TD>
<TD class=fcHeaderTitle><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl02", "", false, "", "Or.aspx", false, true))'>Or</A></TD>
<TD class=fcHeaderImage><INPUT onclick='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl03", "", false, "", "Or.aspx", false, false))' alt=1 src="../Images/forecast/pollenIcon_1.gif" type=image border=0 name=ctl00$cphMain$ctl00$ctl03></TD>
<TD class=fcHeaderTitle><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl04", "", false, "", "Hassel.aspx", false, true))'>Hassel</A></TD>
<TD class=fcHeaderImage><INPUT onclick='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl05", "", false, "", "Hassel.aspx", false, false))' alt=2 src="../Images/forecast/pollenIcon_2.gif" type=image border=0 name=ctl00$cphMain$ctl00$ctl05></TD>
<TD class=fcHeaderTitle><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl06", "", false, "", "Salix.aspx", false, true))'>Salix</A></TD>
<TD class=fcHeaderImage><INPUT onclick='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl07", "", false, "", "Salix.aspx", false, false))' alt=34 src="../Images/forecast/pollenIcon_34.gif" type=image border=0 name=ctl00$cphMain$ctl00$ctl07></TD>
<TD class=fcHeaderTitle><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl08", "", false, "", "Bjork.aspx", false, true))'>Bjørk</A></TD>
<TD class=fcHeaderImage><INPUT onclick='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl09", "", false, "", "Bjork.aspx", false, false))' alt=3 src="../Images/forecast/pollenIcon_3.gif" type=image border=0 name=ctl00$cphMain$ctl00$ctl09></TD>
<TD class=fcHeaderTitle><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl10", "", false, "", "Gress.aspx", false, true))'>Gress</A></TD>
<TD class=fcHeaderImage><INPUT onclick='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl11", "", false, "", "Gress.aspx", false, false))' alt=4 src="../Images/forecast/pollenIcon_4.gif" type=image border=0 name=ctl00$cphMain$ctl00$ctl11></TD>
<TD class=fcHeaderTitle><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl12", "", false, "", "Burot.aspx", false, true))'>Burot</A></TD>
<TD class=fcHeaderImageRight><INPUT onclick='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl13", "", false, "", "Burot.aspx", false, false))' alt=5 src="../Images/forecast/pollenIcon_5.gif" type=image border=0 name=ctl00$cphMain$ctl00$ctl13></TD></TR>
<TR>
<TD class=fcHeaderDay>ma</TD>
<TD class=fcHeaderDay>ti</TD>
<TD class=fcHeaderDay>ma</TD>
<TD class=fcHeaderDay>ti</TD>
<TD class=fcHeaderDay>ma</TD>
<TD class=fcHeaderDay>ti</TD>
<TD class=fcHeaderDay>ma</TD>
<TD class=fcHeaderDay>ti</TD>
<TD class=fcHeaderDay>ma</TD>
<TD class=fcHeaderDay>ti</TD>
<TD class=fcHeaderDay>ma</TD>
<TD class=fcHeaderDayRight>ti</TD></TR>
<TR>
<TD class=fcRegion><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl14", "", false, "", "Ostlandet_med_Oslo.aspx", false, true))'>Østlandet med Oslo</A></TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Moderat spredning" class=fcValueCell bgColor=#f8a722> </TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCellRight bgColor=#ffffff> </TD></TR>
<TR>
<TD class=fcRegion><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl15", "", false, "", "Sorlandet.aspx", false, true))'>Sørlandet</A></TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Moderat spredning" class=fcValueCell bgColor=#f8a722> </TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCellRight bgColor=#ffffff> </TD></TR>
<TR>
<TD class=fcRegion><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl16", "", false, "", "Rogaland.aspx", false, true))'>Rogaland</A></TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCellRight bgColor=#ffffff> </TD></TR>
<TR>
<TD class=fcRegion><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl17", "", false, "", "Hordaland.aspx", false, true))'>Hordaland</A></TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Moderat spredning" class=fcValueCell bgColor=#f8a722> </TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCellRight bgColor=#ffffff> </TD></TR>
<TR>
<TD class=fcRegion><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl18", "", false, "", "Sogn_og_Fjordane.aspx", false, true))'>Sogn og Fjordane</A></TD>
<TD title="Moderat spredning" class=fcValueCell bgColor=#f8a722> </TD>
<TD title="Moderat spredning" class=fcValueCell bgColor=#f8a722> </TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCellRight bgColor=#ffffff> </TD></TR>
<TR>
<TD class=fcRegion><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl19", "", false, "", "More_og_Romsdal.aspx", false, true))'>Møre og Romsdal</A></TD>
<TD title="Moderat spredning" class=fcValueCell bgColor=#f8a722> </TD>
<TD title="Moderat spredning" class=fcValueCell bgColor=#f8a722> </TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCellRight bgColor=#ffffff> </TD></TR>
<TR>
<TD class=fcRegion><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl20", "", false, "", "Indre_Ostlandet.aspx", false, true))'>Indre Østlandet</A></TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCellRight bgColor=#ffffff> </TD></TR>
<TR>
<TD class=fcRegion><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl21", "", false, "", "Sentrale_fjellstrok_i_Sor-Norge.aspx", false, true))'>Sentrale fjellstrøk i Sør-Norge</A></TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCellRight bgColor=#ffffff> </TD></TR>
<TR>
<TD class=fcRegion><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl22", "", false, "", "Trondelag.aspx", false, true))'>Trøndelag</A></TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Beskjeden spredning" class=fcValueCell bgColor=#ebf187> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCellRight bgColor=#ffffff> </TD></TR>
<TR>
<TD class=fcRegion><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl23", "", false, "", "Nordland.aspx", false, true))'>Nordland</A></TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCellRight bgColor=#ffffff> </TD></TR>
<TR>
<TD class=fcRegion><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl24", "", false, "", "Troms.aspx", false, true))'>Troms</A></TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCellRight bgColor=#ffffff> </TD></TR>
<TR>
<TD class=fcRegion><A href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$ctl00$ctl25", "", false, "", "Finnmark.aspx", false, true))'>Finnmark</A></TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCell bgColor=#ffffff> </TD>
<TD title="Ingen spredning" class=fcValueCellRight bgColor=#ffffff> </TD></TR></TBODY></TABLE>

Hvordan kan jeg her f.eks bare vise alt innenfor TR-taggene hvor man finner en match på "Sentrale_fjellstrok_i_Sor-Norge.aspx" i første TD?

Endret av Evelen!
Lenke til kommentar
Videoannonse
Annonse

Det beste er om du parser html dokumentet og søker etter det rette elementet med xpath.

Jeg bruker modulen lxml sammen med Python, men det skal ikke ha no å si i forhold til xpath syntaxen.

tree.xpath(".//tr/td[@class='fcRegion']/a[contains(text(), 'Sentrale')]/../..")
"tr" - Finner første TR tag.
"td[@class='fcRegion']" - Finner følgende TD tag der class='fcRegion'.
"a[contains(text(), 'Sentrale')]" - Her ligger koden du er ute etter.

"contains" - Sjekker om venstre parameter inneholder høyre paramter.
"text()" - Henter teksten fra A taggen.
"Sentrale" - Teksen du velger å søke etter.

"/.." - henter foreldre noden, parentNode.
Siden vi er inne i A taggen og skriver "/../.." hopper vi først tilbake til TD taggen før vi går til TR taggen.
Da får du elementet du er ute etter.

Note: Husk at søket er case-sensetiv, så "sentrale" vil ikke gi deg et treff, men "Sentrale" vil.

Endret av Axxxy
Lenke til kommentar

 

Takk for svar, men er xpath noe jeg kan brukes i powershell?

xpath : The term 'xpath' is not recognized as the name of a cmdlet, function, script file, or operable program.

 

Ser likt ut:

$file.SelectNodes()
// I ditt tilfelle
$forecast.selectNodes("<xpath syntax>")

Vet ikke om den støtter de fancy'e kommandoene i syntaxen, du får bare prøve.

Source -> http://stackoverflow.com/questions/17583373/selecting-attributes-in-xml-using-xpath-in-powershell

Endret av Axxxy
Lenke til kommentar

Haha, sant det. Men jeg anbefaler deg på det sterkeste å bruke en modul når det kommer til webscraping, fordi:

 

  1. Du koder kjappere.
  2. Koden kan gå kjappere.
  3. Det er lettere å forstå.
  4. Det er lettere å bruke.
  5. Du får et mye mer stabilt system, da en parser er fleksibel.
Lenke til kommentar

Om du tilfeldigvis har noen erfaring med dette i powershell hadde det vært fint :p

Ser det er veldig lite info på nettet om hvordan man faktisk bruker det.

 

Prøvde copypaste litt fra denne siden: https://github.com/kbrammer/kevinbrammer.azurewebsites.net/wiki/Using-HtmlAgilityPack-With-Powershell (selv om jeg ikke helt skjønner hva det meste av den koden gjør)

$HtmlAgilityPack = "C:\Users\Flemming\Documents\PS\Ekstra\HtmlAgilityPack.1.4.6\Net45\HtmlAgilityPack.dll" # link to HtmlAgilityPack.dll
$url = "http://www.pollenvarslingen.no/forsiden/varsel.aspx"

[Reflection.Assembly]::LoadFile("$HtmlAgilityPack”)
[HtmlAgilityPack.HtmlWeb]$web = @{}
[HtmlAgilityPack.HtmlDocument]$doc = $web.Load("$url")
[HtmlAgilityPack.HtmlNodeCollection]$nodes = $doc.DocumentNode.SelectNodes("//meta")
$nodes | ForEach-Object { $_.OuterHtml }

$nodes

output virker ikke å være veldig selvforklarende for meg.

Lenke til kommentar

Om du tilfeldigvis har noen erfaring med dette i powershell hadde det vært fint :p

Det har jeg dessverre ikke, men ut ifra det jeg har sett idag så kjenner jeg at jeg må lese litt på hva powershell kan.

Tar en kikk på dette her nå, ser om jeg får til noe interessant i forhold til det du er ute etter.

Lenke til kommentar

Jada, fikk det til!

 

I tilfelle du ikke allerede har gjort det:

1) Last ned HtmlAgilityPack herfra -> https://htmlagilitypack.codeplex.com/
2) Pakk ut en av mappene hvor enn du vil, jeg brukte "Net45" filene.

 

Og her finner du dokumentasjonen på HAP -> https://htmlagilitypack.codeplex.com/downloads/get/120935#

Den ligger i en .chm fil du må laste ned og åpne.

 

Ved å bruke eksempelet som ligger på bunn her -> http://www.leeholmes.com/blog/2010/03/05/html-agility-pack-rocks-your-screen-scraping-world/

add-type -Path .\HtmlAgilityPack.dll
$doc = New-Object HtmlAgilityPack.HtmlDocument

# Om du har HTML dokumentet lagret i en fil, bruk:
$result = $doc.Load("path\to\your\file\texts.html")

# Her kan du bruke xpath.
# SelectNodes velger 'alle' nodene den møter på som stemmer med søket.
$fjellstrok = $doc.DocumentNode.SelectNode(".//tr/td[@class='fcRegion']/a[contains(text(), 'Sentrale')]/../..")

# Skriv inn $fjellstrok og du får en vegg av en tekst som inneholder kun de elementene du er ute etter.

Referer til brukermanualen eller google for å lære mer om HAP.

Endret av Axxxy
Lenke til kommentar

Update.

# For å få tak i teksten til elementet som ligger i $texts
$texts.InnerText

# For å få tak i HTML koden til elementet som ligger i $texts
$texts.OuterHtml

# For å få en liste med kommander du kan bruke sammen med $texts
$texts | Get-Member

# Herfra kan du repetere samme SelectNodes(for alle) eller 
#SelectSingleNode(for den første den møter på) $texts objektet.
$texts.SelectSingleNode("td[@class='fcValueCellRight']")

# Koden ovenfor vil velge TD elementet der class='fcValueCellRight',
#altså den siste TD taggen som ligger TR elementet du jobber med.

Bare husk at du jobber nå med objekter og ikke tekst. 

Endret av Axxxy
Lenke til kommentar

Blir mangen poster her nå, men man oppdager stadig noe nytt i denne data verdnene  :wee:

 

  • Her har du et greit start punkt når det kommer til xpath -> https://www.w3schools.com/xml/xpath_intro.asp
  • Siden xpath tydligvis er universalt uansett hvilket språk du jobber med, ikke tenk på å google etter powershell spesifikke spørsmål når du bruker xpath.
  • Bli kjent med kommandoene og funksjonene du kan bruke på et HAP dokument, som å hente ut teksten fra et element "InnerHtml". Xpath brukes i hovedsak til å hente elementet du er ute etter, derfra kan du prosessere resultatet med innebygde kommandoer og funksjoner.

Om du ønsker å få deg et bedre overblikk med HTML koden du jobber med og ikke allerede har gjort det:

Bruker nevnt verktøy ovenfor konstant. Det er mye lettere å forstå hva som ligger hvor.

Lenke til kommentar

Takk for mange gode innlegg, skal så prøvd å satt meg litt mer inn i dette de neste dagene i den grad jeg får tid.

xpath, baserer den seg på ren tekst, eller som kode sortert i objekter i en gode?

 

Dersom det er rent tekst spiller det vel ingen rolle om det er fra Invoke-WebRequest eller HAP. (?) Men bruker den objekter er vel sistnevnte det greieste.

 

XML er veldig enkelt i powershell, ble overasket over hvor mye værre vanlig HTML var :p

Lenke til kommentar

HAP og alle andre xml/HTML parsere tar ren tekst som input og kommer ut med et objekt. Hvordan og hva dette objektet er varierer ut ifra hvilken modul du bruker, men det går relativt ut på det samme. Og det er akkurat det som gjør det mulig å navigere i xml/HTML dokumentet. XPath funker derfor bare med et slikt dokument, da den ikke behandler det som ren tekst men et "tree" system, litt på samme måte som du organiserer mapper på datamaskinen.

Invoker-WebRequest brukes til å hente data fra nettet i.e HTML koden i en nettside. Du bruker da invoker til å hente koden også kan du sende den direkte til HAP, isteden for å lagre den lokalt i en fil før du åpner den selvfølgelig. Hvilken kommando du må bruke for å gi HAP ren tekst isteden for et fil er jeg usikker på, men det finner du nok ut av :D

Desidert! Selv om de bygger på mye av det samme så inneholder HTML så mye annet. Jeg vil anbefale deg på det sterkeste å øve deg på et xml dokument sammen med HAP. Ta en rss feed fra VG.no for eksempel.
-> http://www.vg.no/rss/feed/?categories=1068&keywords=&limit=10&format=rss

Her vil du finne de 10 siste artiklene til VG som blir konstant oppdatert. Hver artikkel ligger i "item" tags, der finner du tittelen, linken, description, dato osv osv. Alle item tags ligger i "channel" taggen.

Det som kan være greit å legge merke til er at det første elementet i xml filen er en "rss" tag, og det første elementet referer man ikke til, det er elementet du sitter med som standard når du HAP har lest xml/HTML teksten.

For å hente ut tittelen til en/eller flere artikler, ville du brukt følgende XPath:
 

"/channel/item/title"

Nå som du har det ene eller alle tittel elemente(ne) (kommer helt an på om du bruker SelectNodes eller SelectSingleNode), da kan du hente ut teksten med "InnterHtml".

Prøv å lag et enkelt program der du går gjennom hver enkel "item" tag og echo'er ut tittel+link, I.e:

Tittel
Link

Tittel
Link
..

Om xml/HTML dokumentet du går gjennom har flere tags med samme navn som leder forskjellige steder, da kan du spesifisere taggen du vil ha med "attribute" verdiene:

<div class="number1">
<div class="number2">
<div>

Bruker du XPath ("/div") ovenfor, da ender du opp med alle 3. For å spesifisere hvilken "class" verdi du er ute etter, gjør følgende.

"div[@class='number2']"

Denne XPath koden vil kun gi deg det midterste elementet.

Det er også veldig viktig å vite forskjell på når XPath kommandoen starter med
(/) - absolute path - begynnelsen av dokumentet.
(//) - vet du ikke hvor dypt taggen(e) ligger? Bruk denne.
(.//) - har du fått tak i et element fra dokumentet og du ønsker å søke fra begynnelsen av elementet du har, og ikke fra begynnelsen av dokumentet, bruk denne.

Håper dette er med på å dytte deg i rett retning. Får du problemer underveis, da må du bare spørre om hjelp :)

Bruker mobil og har ikke tilgang til disse fancye innstillingene, så jeg skal formatere innlegget i morgen.

Endret av Axxxy
Lenke til kommentar

,,

Supert, og takk for hjelp :) Har endelig skjønt litt av det

Har laget meg denne koden nå:

 

 

cd "C:\Users\fleska\Desktop\testps\HtmlAgilityPack.1.4.6\Net45"
add-type -Path .\HtmlAgilityPack.dll
$doc = New-Object HtmlAgilityPack.HtmlDocument 
$result = $doc.Load("C:\Users\fleska\Desktop\testps\Varsel.html")
$output = $doc.DocumentNode.SelectNodes("//*[@id='forecastTable']/table/tbody/tr[3]/td[2]")
Write-Host Her er det $output.OuterHtml.Split('"')[1]
Som gir meg output:

 

 

Her er det Beskjeden spredning

Fant også en kjekk funksjon i Chrome:

 

 

post-74970-0-44726700-1487668968_thumb.png

 

 

 

Neste utfordring: Hvordan hente dette direkte fra web uten å mellomlagre lokale .html filer  :hmm:

Endret av Evelen!
Lenke til kommentar

Flotte greier!

 

Her har du 2 linker som beskriver hvordan du kan hente ut HTML koden fra nettsider direkte.

https://superwidgets.wordpress.com/tag/read-html-via-powershell-powershell/

 

http://dotnethappens.com/powershell-screen-scraping-using-xpath-selectors-and-htmlagilitypack/

 

En annen ting å ha i baktankene er at når du bruker tr[3], så henter den ut det 3. tr elementet. Om nettsiden du henter ut data fra en dag skulle bestemme seg for å legge inn et ekstra tr element i starten av dokumentet, så vil du endte opp med feil tr element, da elementet du er ute etter nå har flyttet seg til tr[4].

 

Nørd-info:

Om du kun skal hentet ut et element vil det egne seg bedre om du bruker "selectSingleNode".

1) Du unngår å få flere elementer med samme path.(den velger den første den møter på, det kan du forandre ved bruk av[])

2) den er kjappere da den slutter å lete i dokumentet når den har funnet en match.

Lenke til kommentar

 

Neste utfordring: Hvordan hente dette direkte fra web uten å mellomlagre lokale .html filer  :hmm:

 

Jeg har skrevet et fullverdi script i PowerShell som fungerer. I tilfelle du ønsker å finne ut av det selv, skjuler jeg koden i en spoiler.

 

Jeg har lagt inn kommentarer for alle kommandoene som beskriver hva de gjør.

Scriptet henter ut HTML koden fra pollenvarslingen.no og mater den direkte til HAP før den bruker xPath til å finne utvalgte elementer.

 

 

 

# CD to specified folder.
# Importing HAP
add-type -Path .\HtmlAgilityPack.dll

# URL
$url = "http://www.pollenvarslingen.no/Forsiden/Varsel.aspx"

# Creating HAP document
$doc = New-Object HtmlAgilityPack.HtmlDocument

# Read and parse HTML content
$doc.LoadHtml((iwr $url).RawContent)

# Get the element concerning specified area
$tr = $doc.DocumentNode.SelectSingleNode(".//tr/td[@class='fcRegion']/a[contains(text(), 'Sentrale')]/../..")

# Ignoring the first td, getting the second td element.
#$td = $tr.SelectSingleNode(".//td[2]")

# Echo the value in the "title" attribute
#echo $td.Attributes["title"].value


#------------------------------------------------------
# Echoing all the values in a nicely formated way
#------------------------------------------------------
# Echoing the name of the area
Write-Host $tr.SelectSingleNode(".//td[1]").InnerText `n

# Echoing all the "title" attributes
Write-Host Or -        Idag:`t`t`t $tr.SelectSingleNode(".//td[2]").Attributes["title"].value
Write-Host Or -     Imorgen:`t`t   $tr.SelectSingleNode(".//td[3]").Attributes["title"].value
Write-Host Hassel -    Idag:`t`t   $tr.SelectSingleNode(".//td[4]").Attributes["title"].value
Write-Host Hassel - Imorgen:`t     $tr.SelectSingleNode(".//td[5]").Attributes["title"].value
Write-Host Salix -     Idag:`t`t   $tr.SelectSingleNode(".//td[6]").Attributes["title"].value
Write-Host Salix -  Imorgen:`t     $tr.SelectSingleNode(".//td[7]").Attributes["title"].value
Write-Host Bjork -     Idag:`t`t   $tr.SelectSingleNode(".//td[8]").Attributes["title"].value
Write-Host Bjork -  Imorgen:`t     $tr.SelectSingleNode(".//td[9]").Attributes["title"].value
Write-Host Gress -     Idag:`t`t   $tr.SelectSingleNode(".//td[10]").Attributes["title"].value
Write-Host Gress -  Imorgen:`t     $tr.SelectSingleNode(".//td[11]").Attributes["title"].value
Write-Host Burot -     Idag:`t`t   $tr.SelectSingleNode(".//td[12]").Attributes["title"].value
Write-Host Burot -  Imorgen:`t     $tr.SelectSingleNode(".//td[13]").Attributes["title"].value

Om du ønsker å få varsler fra et annet sted, legg inn din egen xPath, eller bytt ut "Sentrale" med f.eks "Romsdal" på slutten av xPath kommandoen.

 

Just in case:

`n = Ny linje
`t = Tab

 

 

Endret av Axxxy
Lenke til kommentar

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?

 

 

Måtte så endre litt i koden min for at det skulle virke (/tbody/ var der ikke i motsetning til i sta).

Før:

"//*[@id=forecastTable]/table/tbody/tr[3]/td[2]"

Nå:

"//*[@id=forecastTable]/table/tr[3]/td[2]"

$HtmlAgilityPack_Folder = "C:\Users\fleska\Desktop\testps\HtmlAgilityPack.1.4.6\Net45"
$HtmlAgilityPack_File = 'HtmlAgilityPack.dll'
$url = "http://www.pollenvarslingen.no/Forsiden/Varsel.aspx"

cd $HtmlAgilityPack_Folder
add-type -Path .\$HtmlAgilityPack_File
$doc = New-Object HtmlAgilityPack.HtmlDocument 
$doc.LoadHtml((iwr $url).RawContent)

$output = $doc.DocumentNode.SelectNodes("//*[@id='forecastTable']/table/tr[3]/td[2]")

Write-Host Her er det $output.OuterHtml.Split('"')[1]

Forøvrig enig i det du skriver i forrige innlegg med at det kan være bedre å spesifisere hvilket element man skal ha fremfor å bruke nr.

Just in case:

`n = Ny linje
`t = Tab

 

Kunne du spesifisert litt hva disse er godt for? Skjønte den ikke helt Endret av Evelen!
Lenke til kommentar

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?

 

Nei det gjør jeg ikke haha, så lenge det funker er jeg fornøyd. Kan alltids google det.

 

 

 

"//*[@id=forecastTable]/table/tbody/tr[3]/td[2]"

Noen ganger har jeg opplevd at en tbody sniker seg inn selv om den ikke vises i kilde koden på chrome. Det ser du evt. når du analyserer html koden HAP har fått tak i.

`n = Ny linje
`t = Tab

`n er det samme som ny linje når du trykker på ENTER i et word dokument.

`t gir samme effekt som når du trykker på TAB (knappen over caps lock). Den flytter teksten fremover med 4 mellomroms mellomrom ish.

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...