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);