我想从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是否会暂停系统?如果没有消息框,我有什么方法可以做到这一点吗?
答案 0 :(得分:6)
您可以尝试使用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);