この件に関して私が読んだ回答のほとんどは、System.Windows.Forms.WebBrowser クラスまたは Microsoft HTML Object Library アセンブリの COM インターフェイス mshtml.HTMLDocument のいずれかを指しています。
WebBrowser クラスは、私をどこにも導きませんでした。次のコードは、Web ブラウザーでレンダリングされた HTML コードを取得できません。
[STAThread]
public static void Main()
{
WebBrowser wb = new WebBrowser();
wb.Navigate("https://www.google.com/#q=where+am+i");
wb.DocumentCompleted += delegate(object sender, WebBrowserDocumentCompletedEventArgs e)
{
mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)wb.Document.DomDocument;
foreach (IHTMLElement element in doc.all)
{
System.Diagnostics.Debug.WriteLine(element.outerHTML);
}
};
Form f = new Form();
f.Controls.Add(wb);
Application.Run(f);
}
上記はほんの一例です。私がいる町の名前を見つけるための回避策を見つけることにはあまり興味がありません。そのような動的に生成されたデータをプログラムで取得する方法を理解する必要があるだけです。
( new System.Net.WebClient.DownloadString(" https://www.google.com/#q=where+am+i ") を呼び出し、結果のテキストをどこかに保存し、現在いる町の名前を検索します見つかった場合はお知らせください。)
しかし、Web ブラウザ (つまり、Firefox) から " https://www.google.com/#q=where+am+i " にアクセスすると、Web ページに自分の町の名前が表示されます。Firefox で、町の名前を右クリックして [Inspect Element (Q)] を選択すると、HTML コードに書かれた町の名前がはっきりとわかります。これは、たまたま、WebClient によって返される生の HTML とはかなり異なって見えます。 .
System.Net.WebBrowser で遊ぶのに飽きた後、mshtml.HTMLDocument を試してみることにしました。同じ役に立たない未加工の HTML で終わるだけです。
public static void Main()
{
mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)new mshtml.HTMLDocument();
doc.write(new System.Net.WebClient().DownloadString("https://www.google.com/#q=where+am+i"));
foreach (IHTMLElement e in doc.all)
{
System.Diagnostics.Debug.WriteLine(e.outerHTML);
}
}
この種の情報を取得するエレガントな方法があるに違いないと思います。今私が考えることができるのは、WebBrowser コントロールをフォームに追加し、問題の URL に移動させ、キー "CLRL, A" を送信し、ページに表示されたものをクリップボードにコピーして、それを解析します。しかし、それは恐ろしい解決策です。