Большинство ответов, которые я прочитал относительно этой темы, указывают либо на класс System.Windows.Forms.WebBrowser, либо на интерфейс COM mshtml.HTMLDocument из библиотеки Microsoft HTML Object Library.
Класс WebBrowser не привел меня нигде. Следующий код не может получить код 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);
}
Вышеприведенный пример. Мне не очень интересно найти обходной путь для выяснения названия города, где я находилюсь. Мне просто нужно понять, как программно извлекать данные динамически генерируемых данных.
(Вызов новой System.Net.WebClient.DownloadString( "https://www.google.com/#q=where+am+i" ), сохраните полученный текст где-нибудь, найдите название города, в котором вы в настоящее время расположены, и дайте мне знать, сможете ли вы найти его.)
Но когда я получаю доступ к https://www.google.com/#q=where+am+i из своего веб-браузера (то есть или firefox), я вижу название моего города, написанное на веб-странице. В Firefox, если я нажимаю правой кнопкой мыши на название города и выбираю "Осмотреть элемент (Q)", я отчетливо вижу название города, написанное в HTML-коде, которое, похоже, сильно отличается от необработанного HTML, возвращаемого WebClient.
После того, как я устал играть в 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" и скопировать все, что будет отображаться на странице в буфер обмена, и попытаться проанализируйте его. Это ужасное решение.