用C#编写保存整个网页(包括图像/格式)的代码?

5

我一直在寻找一个C#代码示例(我正在使用C# Visual Studio 2008 Express),可以编程地保存整个网页(给定URL),包括图像和格式(例如CSS)。意图是在随后的阶段将其发送出去(还不确定如何),以便稍后通过浏览器查看。

是否有最简单的方法示例(利用.NET Framework方法)来保存整个网页?将其保存为一个页面,带有图像子目录或其他方式。基本上与您在浏览器中说“保存整个网页”时获得的相同。


你需要HTML还是其他格式? - Aaron Daniels
1
如果是我,我会尝试找出一种自动化Internet Explorer或Firefox执行“另存为”的方法。 - Robert Harvey
@Robert,为什么不直接执行“wget URL”或类似命令呢? http://gnuwin32.sourceforge.net/packages/wget.htm - Tzury Bar Yochay
我在使用这些类型的库方面取得了有限的成功。虽然它们很适合从互联网上获取信息,但似乎在保持网页完整性方面并不是很好。 - Robert Harvey
3个回答

6
最简单的方法可能是在您的应用程序中添加一个WebBrowser Control,并使用Navigate()方法将其指向要保存的页面。然后,在文档加载完成后,调用ShowSaveAsDialog method。用户可以将页面保存为单个文件或带有子目录中图像的文件。
[更新]
现在注意到您的问题中有“以编程方式”,上述方法不理想,因为它要求用户参与或深入了解Windows API,以使用SendKeys或类似工具发送输入。 .NET Framework中没有内置的功能可以满足您的所有要求。
所以我的改进方法是:
  • 使用System.NET.HttpWebRequest获取主HTML文档作为字符串或流(很容易)。
  • 将其加载到HTMLAgilityPack文档中,您现在可以轻松地查询文档以获取所有图像元素,样式表链接等的列表。
  • 然后为每个文件进行单独的Web请求,并将它们保存到子目录中。
  • 最后,更新主页面中的所有相关链接,使其指向子目录中的项目。
实际上,您将要实现一个非常简单的Web浏览器。您可能会遇到使用JavaScript动态更改或请求页面内容的页面问题,但对于大多数页面,这应该可以得到可接受的结果。

快了……现在我们只需要使用SendKeys填写文件名并点击确定按钮。 呃。 - Robert Harvey
+1 我会选择这种方法。你可能想要考虑的一件事是,是否要将它保存为 MHTML(Mime HTML)文档。这会让你多做一些工作,但不需要子目录。 - Rohit
感谢您指出“HTMLAgilityPack” - 我会深入研究。它似乎是一个非常常用的库 - 它是否是.NET开发人员处理HTML的事实标准? - Greg

1

谢谢 - 我会看一下这个 - 初步看起来似乎有很多代码! :) 我猜没有现成的.NET库可以获取给定网页的所有内容(即HTML,然后返回后续的图像、CSS等)? - Greg

0

这并不是很优雅,但是您可以将 System.Windows.Forms.WebBrowser 导航到 URL,然后调用它的 ShowSaveAsDiagog() 方法来保存页面。


2
@Yoooder,在发布与现有答案完全相同的答案之前,请尝试阅读其他答案! - Ash
3
我懂了。我自己也在准备中,并在 MSDN 上确认方法名称时,没有看到你的内容,直到发布后才看到了你的内容。 - STW

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