2011-09-07 11 views
14

私はASP.NETページと、指定されたWebページを取得するカスタムクラスを持ち、このページ本体を返します。WebBrowserコントロールでレンダリングhtml(Javascriptで処理)を取得する方法は?

protected String GetHtml() 
{ 
      Thread thread = new Thread(new ThreadStart(GetHtmlWorker)); 
    thread.SetApartmentState(ApartmentState.STA); 
    thread.Start(); 
    thread.Join(); 
    return docHtml; 
} 

protected void GetHtmlWorker() 
{ 
    using (WebBrowser browser = new WebBrowser()) 
    { 

       browser.ScriptErrorsSuppressed = true; 
     browser.Navigate(_url); 

     // Wait for control to load page 
     while (browser.ReadyState != WebBrowserReadyState.Complete) 
      Application.DoEvents(); 

     docHtml = browser.DocumentText; 
    } 

しかし、私が必要とするのは、ソースの代わりにDOMのhtmlを取得します。なぜなら、私はjQueryによってDOM上でいくつかの追加操作を行うからです。

場所クラスForm1のフォームにwebBrowser1という名前のWebBrowserコントロール:ここに

+1

ですから、JavaScriptを変更した後、DOMのHTMLである必要がありますか?あなたは文字列としてそれをしたいですか? –

答えて

15

は、私はジャバスクリプトが実行された後にレンダリングされたHTML(DOM)を取得することが分かっ一つの解決策です。

[Form1.csの[デザイン]]次に、コードの使用のため

[Form1.csの]

using System; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace WebBrowserTest 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      this.webBrowser1.ObjectForScripting = new MyScript(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      webBrowser1.Navigate("http://localhost:6489/Default.aspx"); 
     } 

     private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      webBrowser1.Navigate("javascript: window.external.CallServerSideCode();"); 
     } 

     [ComVisible(true)] 
     public class MyScript 
     { 
      public void CallServerSideCode() 
      { 
       var doc = ((Form1)Application.OpenForms[0]).webBrowser1.Document; 
      } 
     } 
    } 
} 

変更webBrowser1.Navigate(」http://localhost:6489/Default.aspx ")パラメータを取得したいjavascriptで処理されたDOMのページに渡します。

次の例のように、CallServerSideCode()メソッドで変更DOMにアクセスすることができます。

doc.GetElementById("myDataTable"); 

それとも、このようなレンダリングされたHTMLにアクセスすることができます:ジョージの1で述べたよう

var renderedHtml = doc.GetElementsByTagName("HTML")[0].OuterHtml; 
+0

それは素晴らしい答えです。RăzvanPanda !!!あなたのコードを使ってColdFusionを動的にレンダリングし、私がsyetemを再構築するまで作業しました。さて、私は実際にレンダリングされたデータ(内側/外側)のHTMLが私が見ているものを返すことができないのを見ることができません。私はそれを退職するために使用できる別の場所または方法はありますか? – CocoaNewBee

+0

@CocoaNewBee:私は他の方法を知らないので、私は研究によってそれにアクセスするこの方法を学んだ。あなたがそれを記述したやり方は、あなたは別のやり方でもそれを得ることはできませんでした。 –

+3

なぜWebBrowser1_DocumentCompletedのようにしますか webBrowser1.Document.GetElementsByTagName( "HTML")[0] .OuterHtml – George

4

をコメントでは、理論的には、単にwebBrowser1_DocumentCompletedでDOMを取得することができます:

webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml; 
+1

これは冗談ではありません。 –

2

最初に少しの背景。私はウェブページから情報を掻き取ろうとしていました。このウェブページのコンテンツは動的です。私がダイナミックを意味するのは、ページの一番下までスクロールすると、Webページがより多くの情報を読み込むということです。 HTMLコンテンツは、ページの一番下にスクロールすると変更されます。残念ながら、Webブラウザオブジェクトはこの情報を自動的には更新しません。それはまだそれが最初にwebbrowser.navigate機能によってロードされた元の文書を持っています。更新された情報はHTMLElementCollectionにあります。

次のコードは私のためには機能しませんでした。

webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml 

魅力のように働いた
Dim eCollections As HtmlElementCollection 
    Dim strDoc As String 
    eCollections = WB.Document.GetElementsByTagName("HTML") 
    strDoc = eCollections(0).OuterHtml 

を次のように私は上記の文を解散しました。これが誰かを助けることを願っています。

+0

ありがとうございます。これは私を助けた。 – user1422348

0

もう1つの方法は、フォームにタイマーを設定することです。タイマーがヒットしたら、ページは再レンダリングされ、ページを解析できます。

-1

あなたはwebBrowser1.Document.Body.OuterHtml

得ることができます

関連する問題