解析本地HTML文件

14 html powershell

我可以使用PowerShell来解析HTML页面

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

PS > $foo.Links.Count
1
Run Code Online (Sandbox Code Playgroud)

但是如果我下载页面

PS > Invoke-WebRequest -OutFile example.htm http://example.com
Run Code Online (Sandbox Code Playgroud)

然后尝试解析下载的页面,它会产生意想不到的结果

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

PS > $foo.Links.Count
0
Run Code Online (Sandbox Code Playgroud)

如何解析本地下载的页面?

Pet*_*erK 24

似乎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;
Run Code Online (Sandbox Code Playgroud)

请注意,当我测试这个时,单个

<meta http-equiv="X-UA-Compatible" content="IE=edge" />
Run Code Online (Sandbox Code Playgroud)

标题阻止我的HTML解析,我不明白为什么 - 文档有类似的XHTML样式标题,MSHTML没有问题.

  • 为第一句话点赞。我尝试了数百次,发现 Invoke-WebRequest 方法无缘无故挂起。现在 Invoke-RestMethod 并按照您的建议放置它救了我;] (2认同)

小智 4

您可以将该文件与 Web 服务器一起使用 来绕过 Invoke-WebRequest 的愚蠢限制

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

PS > $foo.Links.Count
1
Run Code Online (Sandbox Code Playgroud)

请注意,即使没有连接,这也可以工作,例如

PS > Invoke-WebRequest http://example.com
Invoke-WebRequest:无法解析远程名称:“example.com”