html - net - web browser c#
Obtenga HTML de Frame utilizando el control WebBrowser-unauthorizedaccessexception (1)
Gracias a los comentarios de Noseratio logré hacer eso con el control WebBrowser. Aquí hay algunos puntos importantes que pueden ayudar a otros que tienen preguntas similares:
1) Se debe usar el evento DocumentCompleted. Para el cuerpo del evento Navegado del documento es NULL.
2) La siguiente respuesta ayudó mucho: WebBrowserControl: UnauthorizedAccessException al acceder a la propiedad de un Frame
3) No conocía las interfaces similares de IHTMLWindow2, para que funcionaran correctamente. Agregué referencias a las siguientes librerías COM: Microsoft Internet Controls (SHDocVw), Microsoft HTML Object Library (MSHTML).
4) Agarré el html del marco con el siguiente código:
void WebBrowserMain_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url.OriginalString == Constants.FINAL_URL)
{
try
{
var doc = (IHTMLDocument2) WebBrowserMain.Document.DomDocument;
var frame = (IHTMLWindow2) doc.frames.item(0);
var document = CrossFrameIE.GetDocumentFromWindow(frame);
var html = document.body.outerHTML;
var dataParser = new DataParser(html);
//my logic here
}
5) Para el trabajo con Html, utilicé el fino HTML Agility Pack que tiene una muy buena búsqueda de XPath.
Estoy buscando una herramienta gratuita o dlls que pueda usar para escribir mi propio código en .NET para procesar algunas solicitudes web. Supongamos que tengo una URL con algunos parámetros de cadena de consulta similares a http://www.example.com?param=1 y cuando la uso en un navegador, se producen varias redirecciones y, finalmente, se representa HTML que tiene un conjunto de marcos y un marco interno html contiene una tabla con los datos que necesito. Quiero almacenar estos datos en el archivo externo en formato CSV. Obviamente, los datos son diferentes dependiendo del param del parámetro querystring . Digamos que quiero ejecutar la aplicación y generar 1000 archivos CSV para valores de param del 1 al 1000.
Tengo un buen conocimiento en .NET, Javascript, HTML, pero el principal problema es cómo obtener el HTML final en el código del servidor.
Lo que probé es que creé una nueva aplicación de formulario, agregué un control de navegador web y usé un código como este:
private void FormMain_Shown(object sender, EventArgs e)
{
var param = 1; //test
var url = string.Format(Constants.URL_PATTERN, param);
WebBrowserMain.Navigated += WebBrowserMain_Navigated;
WebBrowserMain.Navigate(url);
}
void WebBrowserMain_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
if (e.Url.OriginalString == Constants.FINAL_URL)
{
var document = WebBrowserMain.Document.Window.Frames[0].Document;
}
}
Pero desafortunadamente recibo una excepción no autorizada porque probablemente el marco y el documento están en dominios diferentes. ¿Alguien tiene una idea de cómo solucionar esto y tal vez otro enfoque nuevo para implementar funcionalidades como esta?