如何使用 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 交互式窗口中运行您的代码,结果仍然与我在问题中得到的结果相同,即根本没有页面使用 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 文件中?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PowerShell 或 C# 中获取进程的命令行信息
如何使用 C# 将 powershell 脚本编码为 base64 UTF16-LE 字符串