下载asp.net网站提供的html代码

时间:2011-08-06 21:36:12

标签: c# asp.net html httpwebrequest

我必须下载并解析由ASP.NET呈现的网站。如果我使用下面的代码,我只得到一半的页面而没有我需要的渲染“内容”。我想获得使用Firebug或IE Developer Tool可以看到的完整内容。

我该怎么做?我没有找到解决方案。

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URL);
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());
string code = streamReader.ReadToEnd();

谢谢!

更新

我尝试了webcontrol解决方案。但它没有用。我有一个WPF项目并使用以下代码,甚至没有获取网站的内容。我现在没有看到我的错误:(。

System.Windows.Forms.WebBrowser webBrowser = new System.Windows.Forms.WebBrowser();
Uri uri = new Uri(myAdress);

webBrowser.AllowNavigation = true;
webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);
webBrowser.Navigate(uri);

private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            System.Windows.Forms.WebBrowser wb = sender as System.Windows.Forms.WebBrowser;
            string tmp = wb.DocumentText;

        }

更新2

这是我在此期间提出的代码。 但是我没有得到任何输出。我的elementCollection不返回任何值。 如果我可以将html源代码作为字符串,我会很高兴并使用HtmlAgilityPack解析它。 (我不想将浏览器纳入我的XMAL代码中)

抱歉让你神经紧张!

谢谢!

WebBrowser wb = new WebBrowser();
wb.Source = new Uri(MyURL);        
HTMLDocument doc = (HTMLDocument)wb.Document;
IHTMLElementCollection elementCollection = doc.getElementsByName("body");

    foreach (IHTMLElementCollection element in elementCollection)
    {
        tb.Text = element.toString();
    }

6 个答案:

答案 0 :(得分:3)

如果您所引用的页面具有IFrame或其他动态加载机制,则使用HTTPWebRequest就足够了。一个更好的解决方案是(如果可能的话)使用WebBrowser控件

答案 1 :(得分:2)

答案可能是网站的内容是使用JavaScript呈现的 - 可能是某些AJAX调用从服务器获取其他数据以构建内容。 Firebug和IE Developer Tool将向您显示渲染的html代码,但是如果选择“查看源代码”,您应该会看到与使用代码获取的html相同的html。

我会使用像Fiddler Web Debugger这样的工具来监控页面在渲染时的下载内容。您可以通过模拟页面生成的AJAX请求来获取所需的内容。

请注意,如果使用回发进行导航,则可以模拟浏览ASP.NET网站,因为您需要包含所有表单元素的值(包括隐藏视图状态)模拟点击链接。

答案 2 :(得分:1)

可能不是答案,但您可以使用WebClient类来简化代码:

WebClient client = new WebClient();
string html = client.DownloadString(URL);

答案 3 :(得分:1)

您的代码应该下载整个页面。但是,页面可以通过JavaScript在加载内容后添加内容。除非您在Web浏览器中实际运行该JavaScript,否则您将无法看到您在Firebug中看到的整个DOM。

答案 4 :(得分:1)

你可以试试这个:

public override void Render(HtmlTextWriter writer):
{
    StringBuilder renderedOutput = new StringBuilder();
    Streamwriter  strWriter = new StringWriter(renderedOutput);
    HtmlTextWriter tWriter = new HtmlTextWriter(strWriter);
    base.Render(tWriter);

    string html = tWriter.InnerWriter.ToString();

    string filename = Server.MapPath(".") + "\\data.txt";
    outputStream = new FileStream(filename, FileMode.Create);
    StreamWriter sWriter = new StreamWriter(outputStream);
    sWriter.Write(renderedOutput.ToString());
    sWriter.Flush();

    //render for output
    writer.Write(renderedOutput.ToString());
}

答案 5 :(得分:0)

我建议您使用以下渲染引擎代替Web浏览器

https://github.com/cefsharp/CefSharp

相关问题