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に対して追加の操作を行うためです。
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;
Georgeがコメントの1つで述べたように、理論的には、次のように使用するだけで、webBrowser1_DocumentCompletedでDOMを取得できます。
webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml;
まず少し背景。 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
魅力のように働いた。これが誰かにも役立つことを願っています。
もう1つの方法は、フォームにタイマーを設定することです。タイマーがヒットすると、ページが再レンダリングされ、ページを解析できます。
得られる
webBrowser1.Document.Body.OuterHtml