如何使用 PowerShell 或 C# 将网页保存到 HTML 文件中?

Posted

技术标签:

【中文标题】如何使用 PowerShell 或 C# 将网页保存到 HTML 文件中?【英文标题】:How to save a web page into a HTML file with PowerShell or C#? 【发布时间】:2018-05-15 05:37:17 【问题描述】:

我有以下 link ,当我通过 Chrome 打开链接然后右键单击该页面然后选择“另存为”以将页面保存到 html 文件中 (c:\temp\cu2.html )

保存后,我可以用 HTML 编辑器(比如 VS2015)打开这个 cu2.html 文件,我可以看到 在文件中,有如下所示的标签

但是,如果我用 IE11(而不是 Chrome)打开链接,然后将同一页面保存为 HTML 文件,我根本找不到这个标签。实际上,从IE11保存的html文件和我用下面的PowerShell脚本可以提取的内容是一样的。

#Requires -version 4.0
$url = 'https://support.microsoft.com/en-us/help/4052574/cumulative-update-2-for-sql-server-2017';

$wr = Invoke-WebRequest $url;
$wr.RawContent.contains('<table') # returns false

$wr.RawContent | out-file -FilePath c:\temp\cu2_ps.html -Force; #same as the file saved from the webpage to html file in IE

所以我的问题是:

为什么在 Chrome 中保存的网页(作为 html 文件)与在 IE 中的不同?

如何使用 PowerShell(或 C#)将此类网页保存为 HTML 文件(与 Chrome 中保存的文件相同)?

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

您可以使用Selenium.WebDriver和Selenium.Chrome.WebDriver包下载并保存html内容:

var service = ChromeDriverService.CreateDefaultService();
service.HideCommandPromptWindow = true;
var options = new ChromeOptions();
options.AddArgument("headless");

using (var driver = new ChromeDriver(service, options))

    driver.Url = "https://support.microsoft.com/en-us/help/4052574/cumulative-update-2-for-sql-server-2017";
    File.WriteAllText("cu2_ps.html", driver.PageSource);

但这意味着您需要安装 chrome。您也可以使用 IE 驱动程序,但是按照另一个答案中的建议,使用 IE COM 自动化可能会更好。

【讨论】:

Andrii,我在 Visual Studio 2015 交互式窗口中运行您的代码,结果仍然与我在问题中得到的结果相同,即根本没有 标记。乍一看,我很喜欢你的解决方案,因为它不需要处理IE,所以非常干净,可以在没有安装IE的地方使用。但不幸的是,该解决方案不起作用。 @jyao 我刚刚打开了html它显示404页面没有找到这就是为什么没有内容。我应该在发帖之前检查一下。让我再调查一下。@jyao,确实必须运行脚本才能呈现内容。替代解决方案是使用 Selenium webdriver,但可能与建议的 IE COM 自动化方法没有太大区别。干杯。
【参考方案2】:

页面使用 AngularJS 和 jQuery。这意味着文件准备好后将加载一些内容。因此,当您使用Invoke-WebRequest 发送请求时,您只会收到页面的原始内容。其他内容稍后会加载。

为了解决这个问题,您可以自动化 IE 以获得预期的结果。等待页面准备好就足够了,还需要等待运行AngularJs逻辑并下载所需内容,然后获取文档元素的内容:

$ie = new-object -ComObject "InternetExplorer.Application"
$url = "https://support.microsoft.com/en-us/help/4052574/cumulative-update-2-for-sql-server-2017"
$ie.silent = $true
$ie.navigate($url)
while($ie.Busy)  Start-Sleep -Milliseconds 100 
Start-Sleep 10
$ie.Document.documentElement.innerHTML > "C:\Tempfiles\output.html"
$ie.Stop()
$ie.Quit()

【讨论】:

真的好用!谢谢礼萨。另一方面(我知道我要求的太多了。)您是否可以提出一个不涉及 IE 的解决方案,以便我可以在没有安装 IE 的地方使用它(因为在我的环境中,一个IE 不允许安装在服务器上)。但是,尽管如此,我将您的解决方案作为答案投票,并将在 20 小时内授予您赏金积分(因为系统目前不允许我授予您积分)。再次感谢您的大力帮助。 如果没有浏览器,您的回答是“不,您不能”。因为你需要一个脚本引擎和一个 DOM 引擎等等来执行 javascripts 和操作 DOM。 但是如果你打算使用不同的Browser 来实现自动化,比如Chrome,你可以依赖使用CefSharp。我已经将它与 Windows 窗体一起使用。这意味着您也可以在 PowerShell 中使用它。在最坏的情况下,您可以使用 CefSharp 编写一个 C# 程序来为您完成。但是,在不允许使用 IE 的环境中,我相信使用 CefSharp 有很多使用风险。我不是在谈论 CefSharp,实际上是所有其他 3rd 方浏览器。 顺便说一句,我在脚本末尾添加了$ie.Stop()$ie.Quit()。这是一个非常重要的编辑,不要错过。

以上是关于如何使用 PowerShell 或 C# 将网页保存到 HTML 文件中?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 按组策略检查 PowerShell 禁用

如何在 PowerShell 或 C# 中获取进程的命令行信息

如何使用 C# 将 powershell 脚本编码为 base64 UTF16-LE 字符串

如何在 powershell 中添加和使用 c# 结构

使用 Powershell 或 C# 从 TFS 项目中删除用户

如何在 C# 中运行 powershell 命令