C# - 获取渲染html页面

时间:2014-10-16 19:42:53

标签: javascript c# html

我正在尝试从我的网站获取html字符串,因为它在浏览器中显示

首先我尝试使用网络客户端

using (var client = new WebClient())
{
    var content = client.DownloadString("my_site_address");
}

但在我的网站上我有一些改变视图的javascript代码(而webClient不运行javascript)

所以我使用wpf WebBrowser并在nevigate到欲望网站后显示页面(正如预期的那样)但是当我尝试获取html字符串时它就像webClient一样显示

        dynamic doc = MainBrowser.Document;
        var htmlText = doc.documentElement.InnerHtml;

这就是我得到html的方式:

<!DOCTYPE html>
  <head>
    <title>Title</title>
  </head>
  <body>
    <div class="conteiner">
        <div class="matrix">
            <script type="text/javascript"> 
                // some script code
            </script>
            <script type="text/javascript" src="xxx"></script>
            <a href="Matrix/index.html">Matrix</a>
        </div>
        <div class="zoom">
            <a href="zoom/index.html">Zoom</a>
        </div>
    </div>
        <div class="test">
            <script type="text/javascript"> 
                // some script code
            </script>
            <script type="text/javascript" src"xxx2"></script>
        </div>
  </body>
</html>

这就是我应该在javascript更改之后得到它:

<html><head>
    <title>Title</title>
</head>
  <body>
  <div class="conteiner">
        <div class="matrix">
        <script type="text/javascript"> 
</script>
 <script type="text/javascript" src="xxx"></script><iframe ></iframe><script ></script><div ><div ><iframe >

<html><head>
        <title></title>
</head>
        <body>
            <div >
            <ul><li><ol><li <a </a></li></ol></li></ul>        </div>

</body></html>

 </iframe></div></div></div>
            <a href="Matrix/index.html">Matrix </a>
        </div>
        <div class="zoom">
            <a href="zoom/index.html">Zoom</a>
        </div>
        </div>
        <div class="test">
            <script type="text/javascript"> 

</script>
 <script type="text/javascript" src="xxx2"></script><div ><div ><div ><iframe ></iframe></div></div></div>
        </div>

</body></html>

请帮助:)

2 个答案:

答案 0 :(得分:0)

您可以使用WebDriver中的Selenium框架。它提供不同的Web驱动程序实现,例如Internet Explorer或Firefox。

以下是使用Internet Explorer请求网站的示例代码,让它呈现并最终保存最终的HTML标记。

public class WebSiteHtmlLoader : IDisposable
{
    private readonly RemoteWebDriver _remoteWebDriver;

    public WebSiteHtmlLoader(RemoteWebDriver remoteWebDriver)
    {
        if (remoteWebDriver == null) throw new ArgumentNullException("remoteWebDriver");
        _remoteWebDriver = remoteWebDriver;
    }

    public string GetRenderedHtml(Uri webSiteUri)
    {
        if (webSiteUri == null) throw new ArgumentNullException("webSiteUri");
        _remoteWebDriver.Navigate().GoToUrl(webSiteUri);

        return _remoteWebDriver.PageSource;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    private void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (_remoteWebDriver != null)
            {
                _remoteWebDriver.Quit();
            }
        }
    }
}

用法:

class Program
{
    static void Main(string[] args)
    {
        if (!args.Any())
        {
            return;
        }

        var pageUrl = args.First();
        var options = new InternetExplorerOptions
        {
            IntroduceInstabilityByIgnoringProtectedModeSettings = true,
            PageLoadStrategy = InternetExplorerPageLoadStrategy.Eager
        };

        using (var htmlLoader = new WebSiteHtmlLoader(new InternetExplorerDriver(options)))
        {
            var html = htmlLoader.GetRenderedHtml(new Uri(pageUrl, UriKind.Absolute));
            File.WriteAllText(@"C:\htmlloadertext.html", html);
        }
    }
}

答案 1 :(得分:-2)

您可以尝试使用WebBrowser.DocumentText属性。比如,向应用程序添加一个隐藏的WebBrowser控件并调用Navigate()函数,然后调用该属性以获取生成的HTML 更多信息:http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.documenttext.aspx