web-dev-qa-db-ja.com

WebBrowserコントロールでレンダリングされたHTML(JavaScriptで処理)を取得する方法は?

ASP.NETページと、指定されたWebページをフェッチしてこのページ本文を返すカスタムクラスがあります。

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に対して追加の操作を行うためです。

14
Denis Olifer

Javascriptが実行された後にレンダリングされたHTML(DOM)に到達することがわかった1つの解決策を次に示します。

クラスForm1のフォームにwebBrowser1という名前のWebBrowserコントロールを配置します。

[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;
            }
        }
    }
}

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

次のように、CallServerSideCode()メソッドで変更されたDOMにアクセスできます。

doc.GetElementById("myDataTable");

または、次のようにレンダリングされたHTMLにアクセスできます。

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

Georgeがコメントの1つで述べたように、理論的には、次のように使用するだけで、webBrowser1_DocumentCompletedでDOMを取得できます。

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

まず少し背景。 Webページから情報をこすり取ろうとしています。このウェブページのコンテンツは動的です。動的とは、ページの一番下までスクロールすると、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

魅力のように働いた。これが誰かにも役立つことを願っています。

2
DeltaGuy

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

0
JeffT

得られる

webBrowser1.Document.Body.OuterHtml

0
ngochoaitn