2014-07-27 1 views
10

posso utilizzare PowerShell per analizzare una pagina HTMLanalizzare il file HTML locale

PS > $foo = Invoke-WebRequest http://example.com 

PS > $foo.Links.Count 
1 

Tuttavia se scarico pagina

PS > Invoke-WebRequest -OutFile example.htm http://example.com 

e poi cercare di analizzare la pagina scaricata dà risultato inatteso

PS > $foo = Invoke-WebRequest file://$pwd/example.htm 

PS > $foo.Links.Count 
0 

Come è possibile analizzare la pagina locale scaricata?

risposta

3

È possibile utilizzare il file con un web server per aggirare la limitazione muto di Invoke-WebRequest

PS > $foo = Invoke-WebRequest http://localhost:8080/example.htm 

PS > $foo.Links.Count 
1 

Nota questo funzionerà anche senza connessione, ad esempio

 
PS > Invoke-WebRequest http://example.com 
Invoke-WebRequest : The remote name could not be resolved: 'example.com' 
18

Risulta che Invoke-WebRequest carica gli URI del protocollo file, ma non riesce a analizzarli anche in PowerShell 4.0 (in cui è ufficialmente supportato).

Un'alternativa che non richiede la creazione di un sito Web sarebbe quella di caricare e analizzare HTML direttamente in MSHTML.

$html = New-Object -ComObject "HTMLFile"; 
$source = Get-Content -Path "file.html" -Raw; 
$html.IHTMLDocument2_write($source); 

$html.links.length; 

Nota che quando ho provato questo, un solo colpo di testa

<meta http-equiv="X-UA-Compatible" content="IE=edge" /> 

impedito il mio codice HTML dal parsing e non ho idea del perché - il documento ha avuto simili intestazioni XHTML-stile e MSHTML avuto problemi con quelli.

+1

Upvote per la prima frase. Stavo provando centinaia di volte a vedere i metodi Invoke-WebRequest bloccati senza motivo. Ora Invoke-RestMethod e mettendolo come mi hai suggerito mi ha salvato;] –

+0

Molto utile, grazie. Per quanto riguarda il problema 'IE = edge': da quello che ho capito, impone l'analisi in base agli standard più recenti, quindi forse il contenuto del documento effettivo non era conforme agli standard. – mklement0

-1

Usare il formato di file-link

$foo = Invoke-WebRequest "file:///<path-to-file>" 
+1

Il querent in particolare ha dichiarato che questo non funziona. –