2014-10-16 89 views
0

我想從我的站點獲取HTML字符串,因爲它在瀏覽器中呈現C# - 獲取渲染HTML頁面

首先,我試圖使用Web客戶端

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> 

請幫助:)

+1

不能和你所使用的工具做到這一點。 – Hogan 2014-10-16 19:44:47

+0

您可能需要在客戶端而不是服務器端執行此操作。 – ariscris 2014-10-16 19:48:03

+0

你最好的選擇是在c#中重新創建javascript函數,並在檢索完html後處理它。 – Banana 2014-10-16 19:48:46

回答

0

您可以從Silenium使用WebDriver框架。它提供了不同的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); 
     } 
    } 
}