parser htmlagilitypack hap from example content c# html video xpath

c# - hap - htmlagilitypack load url



Obtenga DOM WebBrowser actual como HTML (1)

Quiero usar el paquete de habilidades HTML en un WebBrowser que ha cargado todo lo que necesito (hace clic en un botón con código para cargar cada video en el canal) (Carga un canal de YouTube y luego carga todos los videos en dicho canal .) Ahora, si trato de obtener todos los detalles de los videos (tengo un código de trabajo que obtiene los primeros 30 videos de un canal en una vista de lista), solo se mostrarán los primeros 30, pero tengo todos los videos cargados en WebBrowser. página (Muestra todos los videos) Estoy usando esto para obtener lo que está cargado actualmente desde el WebBrowser

pero solo carga los primeros 30 videos en lugar de todos los videos cargados desde WebBrowser.


Si el sitio web objetivo utiliza AJAX en gran medida (como lo hace Youtube), es difícil, si no imposible, determinar cuándo la página ha terminado de cargar y ejecutar todos los scripts dinámicos. Pero podría acercarse manejando el evento window.onload y permitiendo un segundo o dos extra para llamadas AJAX no deterministas. Luego, llame a webBrowser.Document.DomDocument.documentElement.outerHTML través de dynamic para obtener el HTML actualmente renderizado.

Ejemplo:

private void Form1_Load(object sender, EventArgs e) { DownloadAsync("http://www.example.com").ContinueWith( (task) => MessageBox.Show(task.Result), TaskScheduler.FromCurrentSynchronizationContext()); } async Task<string> DownloadAsync(string url) { TaskCompletionSource<bool> onloadTcs = new TaskCompletionSource<bool>(); WebBrowserDocumentCompletedEventHandler handler = null; handler = delegate { this.webBrowser.DocumentCompleted -= handler; // attach to subscribe to DOM onload event this.webBrowser.Document.Window.AttachEventHandler("onload", delegate { // each navigation has its own TaskCompletionSource if (onloadTcs.Task.IsCompleted) return; // this should not be happening // signal the completion of the page loading onloadTcs.SetResult(true); }); }; // register DocumentCompleted handler this.webBrowser.DocumentCompleted += handler; // Navigate to url this.webBrowser.Navigate(url); // continue upon onload await onloadTcs.Task; // artificial delay for AJAX await Task.Delay(1000); // the document has been fully loaded, can access DOM here return ((dynamic)this.webBrowser.Document.DomDocument).documentElement.outerHTML; }

[EDITADO] Aquí está la última pieza de código que ayudó a resolver el problema del PO:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(((dynamic)this.webBrowser1.Document.DomDocument).documentElement.ou‌​terHTML);