0

我正在编写一个从 URL 获取内容的软件。在处理该问题时,我遇到了在 java 脚本完成后我无法准确获取 HTML 内容的问题。有些网站通过 java-script 呈现 HTML,有些不支持不运行 js 的浏览器。

我尝试使用System.Windows.Controls.WebBrowserwith WebBrowser.DocumentinLoadCompleted但没有运气。

之后,我尝试了 OpenWebkitSharp 库。在 UI 上,它正确地显示了网站的内容,但是使用 中的代码DocumentDocumentCompleted它仍然返回不是由 java-script 呈现的内容。这是我的代码:

...
using WebKit;
using WebKit.Interop;

public MainWindow()
{
  windowFormHost = new System.Windows.Forms.Integration.WindowsFormsHost();
  webBrowser = new WebKit.WebKitBrowser();
  webBrowser.AllowDownloads = false;
  windowFormHost.Child = webBrowser;
  grdBrowserHost.Children.Add(windowFormHost);
  webBrowser.Load += WebBrowser_Load;
}

private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
  var contentHtml = ((WebKitBrowser)sender).DocumentAsHTMLDocument;
}

contentHtml 具有在 java 脚本完成后未呈现的值。

4

1 回答 1

0

一定要解决这个问题,我在代码中添加了一些技巧,以便在 java-script 完成后获取完整的 Html 内容。

using WebKit;
using WebKit.Interop;
using WebKit.JSCore; //We need add refrence JSCore which following with Webkit package.

public MainWindow()
{
  InitializeComponent();
  InitBrowser();
}

private void InitBrowser()
{
  windowFormHost = new System.Windows.Forms.Integration.WindowsFormsHost();
  webBrowser = new WebKit.WebKitBrowser();
  webBrowser.AllowDownloads = false;
  windowFormHost.Child = webBrowser;
  grdBrowserHost.Children.Add(windowFormHost);
  webBrowser.Load += WebBrowser_Load; 
}

private void WebBrowser_Load(object sender, EventArgs e)
{
  //The ResourceIntercepter will throws exception if webBrowser have not finished loading its components
  //We can not use DocumentCompleted to load the Htmlcontent. Because that event will be fired before Java-script is finised
  webBrowser.ResourceIntercepter.ResourceFinishedLoadingEvent += new ResourceFinishedLoadingHandler(ResourceIntercepter_ResourceFinishedLoadingEvent);
}

private void ResourceIntercepter_ResourceFinishedLoadingEvent(object sender, WebKitResourcesEventArgs e)
{
   //The WebBrowser.Document still show the html without java-script. 
   //The trict is call Javascript (I used Jquery) to get the content of HTML
   JSValue documentContent = null;
   var readyState = webBrowser.GetScriptManager.EvaluateScript("document.readyState");

   if (readyState != null && readyState.ToString().Equals("complete"))
            {
                documentContent = webBrowser.GetScriptManager.EvaluateScript("$('html').html();");
                var contentHtml = documentContent.ToString();
            }

}

希望这个可以帮助你。

于 2017-03-24T08:30:07.203 回答