C# 在WinForms应用程序中将HTML源代码保存为字符串

C# 在WinForms应用程序中将HTML源代码保存为字符串,c#,html,dom,C#,Html,Dom,我需要从一个网站,这是在框架结构的源代码 我已经有了一个Windows窗体应用程序,其中集成了WebBrowser功能。 当我右键单击并选择View Source时,它会打开一个新的文本文档,其中正好包含我需要的信息 我已经试过webBrowser.Document、webBrowser.DocumentText和webBrowser.DocumentStream,但所有这些都只提供了其他信息,我不需要 该网站不是静态的,它是一个聊天室,不进行会话,因此我不能使用Webclient.Downlo

我需要从一个网站,这是在框架结构的源代码

我已经有了一个Windows窗体应用程序,其中集成了WebBrowser功能。 当我右键单击并选择View Source时,它会打开一个新的文本文档,其中正好包含我需要的信息

我已经试过webBrowser.Document、webBrowser.DocumentText和webBrowser.DocumentStream,但所有这些都只提供了其他信息,我不需要

该网站不是静态的,它是一个聊天室,不进行会话,因此我不能使用Webclient.DownloadFile。 我需要有一个持续连接到该网站几个小时没有刷新该网站。我看不到在Windows窗体中使用webBrowser的方法

应要求,这是我所说的网站:
通过在第三个文本框中填写一些用户名,您可以作为来宾登录。

如果您的网站目标使用ssl协议https,您可以尝试添加如下用户代理:

using (WebClient myWebClient = new WebClient())
                            {
                                myWebClient.Headers.Add("User-Agent: Other");               
                                myWebClient.DownloadFile(new System.Uri("https://mywebsite.com//somefile"), "D:\\temp\\somefile");
                            }
如果您的网站目标需要登录,那么您可以在chrome中登录到您的网站目标,并使用EditThisCookie扩展复制您的Cookie,然后尝试以下操作:

using (WebClient myWebClient = new WebClient())
                            {
                                myWebClient.Headers.Add("User-Agent: Other");
                                myWebClient.Headers.Add(HttpRequestHeader.Cookie, "mycookies copies from EditThisCookie");
                                myWebClient.DownloadFile(new System.Uri("https://mywebsite.com//somefile"), "D:\\temp\\somefile");
                            }

由于您希望获得动态html内容和webBrowser.Document,webBrowser.DocumentText和webBrowser.DocumentStream无法满足您的要求

诀窍在于:您可以始终从C运行自定义JavaScript代码。下面是如何在WebBrowser控件中获取当前HTML:

参考

更新

对于文档中的iframe,您可以尝试以下操作:

webBrowser.Document.InvokeScript("eval", new string[]{"document.querySelector(\"iframe\").contentWindow.document.documentElement.outerHTML"});
另一个更新

由于您的站点包含框架而不是iframe,因此以下是如何获取该框架的html内容:

最终测试和工作更新

querySelector在网络控制中不工作。因此,解决方法是:向您的应用程序提供一些id,并使用该id获取该元素

HtmlElement frame = webBrowser1.Document.GetElementsByTagName("frame").Cast<HtmlElement>().FirstOrDefault(m => m.GetAttribute("name") == "mainframe");
if (frame != null)
{
    frame.Id = "RandID_" + DateTime.Now.Ticks;
    string html = webBrowser1.Document.InvokeScript("eval", new string[] { "document.getElementById('" + frame.Id + "').contentWindow.document.documentElement.outerHTML" }).ToString();
    Console.WriteLine(html);
}
else
{
    MessageBox.Show("Frame not found");
}

请在发布Q之前做一些研究。可能的重复为什么不使用HttpClient从wesbite下载@Tatranskymedved这实际上对我一点帮助都没有我认为网络浏览器或任何像CefSharp这样的无头网络浏览器都不能回答你在做什么。我建议你看看这一页:谢谢你的回答。在我的例子中,我不需要下载文件,但要不断跟踪快速变化的html。我正在寻找的是,要想访问html,需要打开有问题的网站。如果我关闭它,我将需要再次登录。您的答案适用于这些条件吗?对于问题的第一部分,您可以尝试DownloadString而不是DownloadFile,然后尝试在其中添加while true和Thread.Sleep2000,这意味着您将每2000ms检查一次目标页面的内容。对于第二部分,cookie有过期日期,wich意味着如果目标页面过期,您将无法再获取目标页面的内容,因此唯一的解决方案是手动执行此操作,重新登录,复制cookie并将其插入web客户端头。我现在尝试了此操作,将复制的cookie添加到WebClient头中。这只会让我进入正常的登录页面。我认为,此网页不适用于cookies,或者至少对此场景没有帮助。如果您关闭浏览器,然后重新打开,是否需要再次登录?谢谢您的回答。虽然这确实给了我html源代码,但它不是我要找的那个。我想我需要的框架的源代码,我在看。正如您所知,注入Javascript是最好的方法suggested@TristanB. 你的问题。在任何地方都没有说Iframe。不用担心,我正在更新iframe的答案。对不起。我很难将我的问题转化为技术术语,因为我不是专业人士,而是学习者。谢谢@特里斯坦。没问题。对不起,如果我让你失望的话。我以前也做过类似的事情。哈哈,我已经更新了答案。试试看。你没有让我泄气,没关系。我尝试了你更新的解决方案,它在我的文件中打印了一个空的新行。你自己看看这个有问题的网站会有帮助吗?
webBrowser.Document.InvokeScript("eval", new string[]{"document.querySelector(\"frame[name='mainframe'\").contentWindow.document.documentElement.outerHTML"});
HtmlElement frame = webBrowser1.Document.GetElementsByTagName("frame").Cast<HtmlElement>().FirstOrDefault(m => m.GetAttribute("name") == "mainframe");
if (frame != null)
{
    frame.Id = "RandID_" + DateTime.Now.Ticks;
    string html = webBrowser1.Document.InvokeScript("eval", new string[] { "document.getElementById('" + frame.Id + "').contentWindow.document.documentElement.outerHTML" }).ToString();
    Console.WriteLine(html);
}
else
{
    MessageBox.Show("Frame not found");
}