como gerar código HTML dinamicamente usando o WebBrowser do .NET ou mshtml.HTMLDocument?
A maioria das respostas que li sobre esse assunto aponta para a classe System.Windows.Forms.WebBrowser ou a interface COM mshtml.HTMLDocument do assembly Microsoft HTML Object Library.
A classe WebBrowser não me levou a lugar algum. O código a seguir falha ao recuperar o código HTML conforme processado pelo meu navegador da web:
[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);
}
O acima é apenas um exemplo. Não estou realmente interessado em encontrar uma solução alternativa para descobrir o nome da cidade onde estou localizado. Eu só preciso entender como recuperar esse tipo de dados gerados dinamicamente programaticamente.
(Ligue para o novo System.Net.WebClient.DownloadString ("https://www.google.com/#q=where+am+i"), salve o texto resultante em algum lugar, procure o nome da cidade em que você está localizado e informe-me se conseguiu encontrá-lo.)
Mas ainda assim, quando eu acesso "https://www.google.com/#q=where+am+i"no navegador da web (ou no firefox), vejo o nome da minha cidade escrito na página da Web. No Firefox, se clicar com o botão direito do mouse no nome da cidade e selecionar" Inspecionar elemento (Q) ", vejo claramente o nome da cidade escrita no código HTML, que parece bastante diferente do HTML bruto retornado pelo WebClient.
Depois que me cansei de jogar o System.Net.WebBrowser, decidi dar uma chance ao mshtml.HTMLDocument, apenas para terminar com o mesmo HTML bruto e inútil:
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);
}
}
Suponho que deve haver uma maneira elegante de obter esse tipo de informação. No momento, tudo o que consigo pensar é adicionar um controle WebBrowser a um formulário, navegar para o URL em questão, enviar as chaves "CLRL, A" e copiar o que for exibido na página para a área de transferência e tentar analisá-lo. Essa é uma solução horrível, no entanto.