【问题标题】:C# - Get a render html pageC# - 获取渲染 html 页面
【发布时间】:2014-10-16 19:42:52
【问题描述】:

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

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

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

但在我的网站中,我有一些更改视图的 javascript 代码(并且 webClient 不运行 javascript)

所以我使用 wpf WebBrowser 并在导航到所需站点后显示页面(如预期的那样),但是当我尝试获取 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>

请帮忙:)

【问题讨论】:

  • 无法使用您正在使用的工具执行此操作。
  • 您可能需要在客户端而不是服务器端执行此操作。
  • 最好的办法是在 c# 中重新创建 javascript 函数并在检索到 html 后对其进行处理。
  • 你可以试试 webkit.net webkitdotnet.sourceforge.net
  • 那么我需要哪些工具?

标签: javascript c# html


【解决方案1】:

您可以使用来自SeleniumWebDriver 框架。它提供不同的 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);
        }
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-06-04
      • 1970-01-01
      • 2010-11-18
      • 2023-03-20
      • 1970-01-01
      • 2012-09-12
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多