2013-09-15 5 views
4

Я хочу использовать пакет возможностей HTML в WebBrowser, который загрузил все, что мне нужно (он нажимает кнопку с кодом для загрузки каждого видео на канал) (Он загружает канал YouTube , а затем загружает все видео на указанном канале.) Теперь, если я попытаюсь получить все детали видео (у меня есть рабочий код, который получает первые 30 видео каналов в списке), он все равно покажет только первые 30 , но у меня есть все видео, загруженное на странице WebBrowser (Он показывает все видео) Я использую это, чтобы получить, Что в настоящее время загружено из WebBrowserПолучить текущий WebBrowser DOM как HTML

enter image description here

, но он по-прежнему загружает только первые 30 видео, а не все видео, загруженные из WebBrowser.

+0

Вы привязаны к технологиям, которые вы используете в настоящее время? PhantomJS действительно хорош в таких вещах. – Brad

+0

, который вернет Html на момент загрузки страницы, а не что-нибудь, что было динамически добавлено с помощью ajax – BrokenGlass

+0

. Как я могу получить динамическую загрузку? –

ответ

5

Если целевой сайт использует AJAX сильно (как это делает Youtube), трудно определить, когда страница закончила загрузку и выполнение всех динамических скриптов. Но вы можете приблизиться, обработав событие window.onload и разрешив дополнительные секунды или два для не детерминированных вызовов AJAX. Затем вызовите webBrowser.Document.DomDocument.documentElement.outerHTML через dynamic, чтобы получить отображаемый в настоящее время HTML.

Пример:

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

[Изменено] Вот окончательный кусок кода, который помог решить проблему Ора в:

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

wut. У меня есть кнопка, которая после загрузки страницы и вызовов AJAX была сделана с помощью кликов, затем она использует страницу. этот ответ меня просто смущает. –

+0

К сожалению, я неправильно понял, как вы загружаете страницу, извините. Просто используйте последнюю часть, чтобы получить текущий снимок HTML-страницы: '((dynamic) this.webBrowser.Document.DomDocument) .documentElement.outerHTML' вместо' webBrowser.DocumentText'. – Noseratio

+0

Это дает мне ошибку, незаконные символы в пути http://i.imgur.com/vYqAGyz.png –

Смежные вопросы