2014-07-27 149 views
10

我可以使用PowerShell來解析HTML頁面解析本地HTML文件

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

PS > $foo.Links.Count 
1 

但是如果我下載的頁面

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

,然後嘗試解析下載頁面它給人意想不到的結果

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

PS > $foo.Links.Count 
0 

如何解析本地下載頁面?

回答

3

您可以使用該文件與 web server 繞過的啞限制調用-的WebRequest

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

PS > $foo.Links.Count 
1 

注意這將不帶連接甚至工作,例如

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

看樣子Invoke-WebRequest加載file協議URI就好,但即使在PowerShell 4.0(官方支持的地方)也無法解析它們。

另一種不需要建立網站的方法是直接加載並解析HTML到MSHTML。

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

$html.links.length; 

需要注意的是,當我測試了這一點,單

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

頭防止從解析我的HTML,我不知道爲什麼 - 該文件也有類似的XHTML風格的標題和MSHTML沒有問題和那些。

+1

給予好評的第一句話。我正在嘗試數百次看到Invoke-WebRequest方法無緣無故掛起。現在調用RestMethod並把它像你建議救了我;] –

+0

非常方便,謝謝。至於'IE = edge'問題:據我所知,它強制按最新標準進行解析,所以也許你的實際文檔內容不符合標準。 – mklement0

-1

使用文件鏈接的格式

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

該querent專門表示,這不起作用。 –