解析本地HTML文件

16

我可以使用PowerShell解析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个回答

27

看起来 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 没有出现任何问题。

2
点赞第一句话。我试了数百次,发现Invoke-WebRequest方法无缘无故地挂起。现在使用Invoke-RestMethod并按照您建议的方式进行操作,解决了我的问题;] - Carl di Ortus
非常方便,谢谢。至于IE=edge问题:据我所知,它强制解析为最新的标准,因此您的实际文档内容可能不符合标准。 - mklement0

4
您可以使用该文件和web服务器来解决Invoke-WebRequest的瓶颈限制。
PS > $foo = Invoke-WebRequest http://localhost:8080/example.htm

PS > $foo.Links.Count
1

请注意,即使没有连接,此方法也可正常工作,例如

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

0

使用文件链接格式

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

修正我的错误

如果HTML是有效的XML,则可以使用select-xml

[xml]$html = Get-Content '<path_to_html_file>'
Select-Xml $html -XPath '//a' | foreach {$_.node}

3
询问者明确表示这个方法不起作用。 - Jeff Zeitlin
1
@JeffZeitlin 请注意链接格式中的第三个正斜杠,而不是OP使用的双斜杠格式。 - F.I.V
@F.I.V - 很好的发现!我不确定我怎么会错过它! - Jeff Zeitlin
@JeffZeitlin:我的意思是用三个斜杠///它可以工作!这使得这个答案不同于OP文本中声称不起作用的内容。因此,这个文本的早期版本是正确的,并且在文件和冒号后使用三个正斜杠对我来说是有效的。 - F.I.V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接