将HTML源代码保存到WinForms应用程序中的字符串

时间:2016-11-28 09:24:16

标签: c# html dom

我需要从一个以框架结构的网站获取源代码。

我已经有一个Windows Forms应用程序,它集成了WebBrowser功能 当我右键单击并选择“查看源代码”时,它会打开一个新的文本文档,其中包含我需要的信息。

我已经尝试了<C-H>webBrowser.DocumentwebBrowser.DocumentText,但所有这些只给了我其他信息,我不需要。

该网站不是静态的(这是一个聊天),它不会进行会话,因此我无法使用webBrowser.DocumentStream
我需要持续连接几个小时的网站,而无需刷新网站。我没有看到使用Webclient.DownloadFile中的webBrowser的方法。

根据要求,这是网站,我在谈论:http://server2.webkicks.de/stackoverflow-test/
您只需在第三个文本框中填写一些用户名即可以访客身份登录。

2 个答案:

答案 0 :(得分:1)

由于您希望获得动态html内容,而webBrowser.DocumentwebBrowser.DocumentTextwebBrowser.DocumentStream无法满足您的愿望。

诀窍:您始终可以从C#运行自定义JavaScript代码。以下是您在WebBrowser控件中获取当前HTML的方法:

webBrowser.Document.InvokeScript("eval", new string[]{"document.body.outerHTML"});

请参阅How to inject Javascript in WebBrowser control?

<强>更新

对于iframe内的document,您可以尝试以下操作:

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

另一次更新

由于您的网站包含frame而不是iframe,因此您可以通过以下方式获取frame的html内容:

webBrowser.Document.InvokeScript("eval", new string[]{"document.querySelector(\"frame[name='mainframe'\").contentWindow.document.documentElement.outerHTML"});

最终测试和工作更新

querySelector无效WebControl。因此,解决方法是:向id提供一些<frame>,并使用<frame>获取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");
}

答案 1 :(得分:0)

如果您的网站目标使用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登录您的websitetarget并使用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");
                            }