当前位置:  开发笔记 > 编程语言 > 正文

如何使用C#将网页保存为文本文件以供以后解析

如何解决《如何使用C#将网页保存为文本文件以供以后解析》经验,为你挑选了1个好方法。

我想从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是否会暂停系统?有没有办法在没有消息框的情况下可以做到这一点?



1> NicoRiff..:

您可以尝试使用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);

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有