2014-07-27 5 views
10

Ich kann Powershell verwenden, um eine HTML-SeiteParse lokale HTML-Datei

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

PS > $foo.Links.Count 
1 

jedoch zu analysieren, wenn ich die Seite

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

und dann versuchen, laden Sie die heruntergeladene Seite zu analysieren gibt es unerwartetes Ergebnis

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

PS > $foo.Links.Count 
0 

Wie kann ich die lokal heruntergeladene Seite analysieren?

Antwort

3

Sie können die Datei mit einem web server verwenden um die stummen Begrenzung der Invoke-WebRequest

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

PS > $foo.Links.Count 
1 

Hinweis wird zu bekommen arbeiten, auch ohne Verbindung, zB

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

Es scheint, Das Invoke-WebRequest lädt file Protokoll-URIs gut, aber sie können nicht analysiert werden, selbst in PowerShell 4.0 (wo es offiziell unterstützt wird).

Eine Alternative, die keine Einrichtung einer Website erfordert, wäre, HTML direkt in MSHTML zu laden und zu analysieren.

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

$html.links.length; 

Beachten Sie, dass, wenn ich das getestet, ein einziger

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

Header meinen HTML von Parsing verhindert, und ich habe keine Ahnung, warum - das Dokument ähnlich XHTML-Stil-Header hatte und MSHTML hatte keine Probleme mit diesen.

+1

Upvote für den ersten Satz. Ich habe hunderte Male versucht, Invoke-WebRequest-Methoden ohne Grund zu sehen. Jetzt Invoke-RestMethod und legte es wie Sie vorgeschlagen gespeichert mich;] –

+0

Sehr praktisch, danke. Was das Problem "IE = Edge" anbelangt: Nach meinem Verständnis zwingt es das Parsen nach den neuesten Standards, also war Ihr tatsächlicher Dokumentinhalt möglicherweise nicht standardkonform. – mklement0

-1

Verwenden Datei-Link-Format

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

Der Querent sagte ausdrücklich, dass dies nicht funktioniert. –

Verwandte Themen