我想从C#加载例如此页面(url)" http://finance.yahoo.com/q/ks?s=FORK+Key+Statistic ",然后将该页面保存为文本文件以供以后解析或刮.我知道我可以通过右键单击页面然后"将页面另存为..."从浏览器(在我的情况下为Firefox)中执行此操作,然后将其另存为文本文件.然后所有包含我需要的数据的文本将在一个文本文件中供以后解析.我想知道如何从C#自动化这个过程.我从MSDN中找到了这个代码,可以自动打印网页:
private void PrintHelpPage() { // Create a WebBrowser instance. WebBrowser webBrowserForPrinting = new WebBrowser(); // Add an event handler that prints the document after it loads. webBrowserForPrinting.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(PrintDocument); // Set the Url property to load the document. webBrowserForPrinting.Url = new Uri(@"\\myshare\help.html"); } private void PrintDocument(object sender, WebBrowserDocumentCompletedEventArgs e) { // Print the document now that it is fully loaded. ((WebBrowser)sender).Print(); // Dispose the WebBrowser now that the task is complete. ((WebBrowser)sender).Dispose(); }
除了只打印页眉之外,这个工作正常.有没有人知道如何通过浏览器中的保存或"保存页面为"命令来执行大致相同的操作?我还尝试了其他选项,如htmlAgilityPack,WebClient和htrpClient.这些方法都返回html源代码,该代码不包含网页上显示的任何数据.如果我能找到如何在网页上找到数据元素的位置ID,那么这也可能很有用.
我终于让它工作了(见下面的代码):
WebBrowser browser = new WebBrowser(); browser.ScriptErrorsSuppressed = true; int j = 0; label1.Text = j.ToString(); label1.Refresh(); int SleepTime = 3000; loadPage: browser.Navigate("http://finance.yahoo.com/q/ks?s=GBX+Key+Statistic"); System.Threading.Thread.Sleep(SleepTime); MessageBox.Show("browser.Navigae OK"); //Why is MessageBox needed here??? label1.Refresh(); if (browser.ReadyState == WebBrowserReadyState.Complete) { // It's done! string path = @"C:\VS2015Projects\C#\caoStocksCS\textFiles\somefile13.txt"; //MessageBox.Show("path OK"); if (browser.Document.Body.Parent.InnerText != null) { File.WriteAllText(path, browser.Document.Body.Parent.InnerText, Encoding.GetEncoding(browser.Document.Encoding)); MessageBox.Show("Success! somefile13.txt created"); } else { MessageBox.Show("browser.Document.Body.Parent.InnerText=" + browser.Document.Body.Parent.InnerText); MessageBox.Show("Failure somefile13.txt not created"); } } else { SleepTime += SleepTime; ++j; label1.Text = j.ToString(); goto loadPage; }
但是,它并不是完全自动化的,因为MessageBox.Show("browser.Navigae OK"); //为什么这里需要MessageBox ??? 或者这里需要一些其他的消息框,否则它就会继续下去.
有谁知道为什么需要MessageBox?无论如何,我可以做MessageBox所做的同样的事情,而不必在这里调用消息框?在单击或解除之前,MessageBox是否会暂停系统?有没有办法在没有消息框的情况下可以做到这一点?
您可以尝试使用WebClient.DownloadString.此方法下载指定的URL代码并将其保存为字符串.你可以查看MSDN的https://msdn.microsoft.com/en-us/library/fhd1f0sw(v=vs.110).aspx
WebClient client = new WebClient(); string downloadString = client.DownloadString("http://finance.yahoo.com/q/ks?s=FORK+Key+Statistic");
然后,为了保存已下载的内容,您可以轻松使用File.WriteAllText.只要您有一个要写入文件的完整字符串(这种情况),就可以使用此方法:
File.WriteAllText("C:/yourWebPAge.txt", downloadString);