jak dynamicznie generować kod HTML za pomocą WebBrowser lub mshtml.HTMLDocument .NET?
Większość odpowiedzi, które przeczytałem na ten temat, wskazuje na klasę System.Windows.Forms.WebBrowser lub interfejs COM mshtml.HTMLDocument z zestawu Microsoft HTML Object Library.
Klasa WebBrowser nie prowadzi mnie nigdzie. Poniższy kod nie może pobrać kodu HTML renderowanego przez moją przeglądarkę internetową:
[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);
}
Powyższe jest tylko przykładem. Nie jestem zainteresowany znalezieniem obejścia dla określenia nazwy miejscowości, w której się znajduję. Po prostu muszę zrozumieć, jak programowo pobrać ten rodzaj dynamicznie generowanych danych.
(Zadzwoń do nowego System.Net.WebClient.DownloadString (”https://www.google.com/#q=where+am+i„), zapisz gdzieś wynikowy tekst, wyszukaj nazwę miejscowości, w której się aktualnie znajdujesz, i daj mi znać, jeśli byłeś w stanie go znaleźć.)
Ale jeszcze kiedy mam dostęp ”https://www.google.com/#q=where+am+i„z mojej przeglądarki internetowej (tj. firefox) Widzę nazwę mojego miasta zapisaną na stronie internetowej. W Firefoksie, jeśli kliknę prawym przyciskiem myszy nazwę miasta i wybieram„ Inspect Element (Q) ”, wyraźnie widzę nazwę miasta zapisanego w kodzie HTML, który wygląda zupełnie inaczej niż surowy kod HTML zwracany przez WebClient.
Po tym, jak zmęczyło mnie granie w System.Net.WebBrowser, postanowiłem dać mshtml.HTMLDocument strzał, by skończyć z tym samym bezużytecznym, surowym 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);
}
}
Przypuszczam, że musi istnieć elegancki sposób na uzyskanie tego rodzaju informacji. W tej chwili wszystko, o czym mogę myśleć, to dodanie formantu WebBrowser do formularza, przejście do danego adresu URL, wysłanie kluczy „CLRL, A” i skopiowanie wszystkiego, co się dzieje na stronie, do schowka i próba parsuj to. Ale to straszne rozwiązanie.