2011-09-07 13 views
14

Mam stronę ASP.NET i niektóre niestandardowe klasy, które pobierają określonej strony internetowej, i zwraca tę treść strony.Jak uzyskać renderowane html (przetwarzane przez Javascript) w formancie WebBrowser?

protected String GetHtml() 
{ 
      Thread thread = new Thread(new ThreadStart(GetHtmlWorker)); 
    thread.SetApartmentState(ApartmentState.STA); 
    thread.Start(); 
    thread.Join(); 
    return docHtml; 
} 

protected void GetHtmlWorker() 
{ 
    using (WebBrowser browser = new WebBrowser()) 
    { 

       browser.ScriptErrorsSuppressed = true; 
     browser.Navigate(_url); 

     // Wait for control to load page 
     while (browser.ReadyState != WebBrowserReadyState.Complete) 
      Application.DoEvents(); 

     docHtml = browser.DocumentText; 
    } 

Ale co muszę - to dostać HTML DOM, zamiast źródła, bo zrobić jakieś dodatkowe operacje ponad DOM przez jQuery..

+1

Więc co trzeba jest html DOM po javascript zmodyfikował go?Czy chcesz go jako ciąg? –

Odpowiedz

15

Oto jedno rozwiązanie znalazłem aby dostać się do wydanego HTML (DOM) został uruchomiony po javascript:

Umieść kontrola WebBrowser nazwie webBrowser1 na formularzu klasy Form1.

[Form1.cs [projekt]]

Następnie do użycia kodu:

[Form1.cs]

using System; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace WebBrowserTest 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      this.webBrowser1.ObjectForScripting = new MyScript(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      webBrowser1.Navigate("http://localhost:6489/Default.aspx"); 
     } 

     private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      webBrowser1.Navigate("javascript: window.external.CallServerSideCode();"); 
     } 

     [ComVisible(true)] 
     public class MyScript 
     { 
      public void CallServerSideCode() 
      { 
       var doc = ((Form1)Application.OpenForms[0]).webBrowser1.Document; 
      } 
     } 
    } 
} 

Zmiana WebBrowser1.Navigate (”http://localhost:6489/Default.aspx ") w Form1_Load do strony, której DOM po przetworzeniu przez javascript chcesz uzyskać.

można otworzyć zmodyfikowaną DOM w metodzie CallServerSideCode(), na przykład:

doc.GetElementById("myDataTable"); 

Albo można uzyskać dostęp do świadczonych HTML tak:

var renderedHtml = doc.GetElementsByTagName("HTML")[0].OuterHtml; 
+0

to świetna odpowiedź Răzvan Panda !!! Użyłem twojego kodu do odczytu zimnej fuzji dynamicznie renderującej stronę i działało, aż musiałem odbudować mój syetem. TERAZ, nie widzę rzeczywistego renderowania danych (wewnętrznego/zewnętrznego) html nie zwracają tego, co widzę. czy istnieje inne miejsce lub metoda, której mogę użyć, aby go wycofać? – CocoaNewBee

+0

@CocoaNewBee: Nie znam żadnej innej drogi, nauczyłem się tego sposobu dostępu do niego przez badania. Sposób, w jaki to opisałeś, jest taki, że nie mógłbyś dostać tego w inny sposób. –

+3

Dlaczego nie zrobić tego w webBrowser1_DocumentCompleted jak webBrowser1.Document.GetElementsByTagName ("HTML") [0] .OuterHtml – George

4

jako George powiedział w jednym z komentarze, teoretycznie można po prostu uzyskać DOM w WebBrowser1_DocumentCompleted przez po prostu:

webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml; 
+1

To działa, to nie jest żart. –

2

Najpierw małe tło. Próbowałem zeskanować informacje ze strony internetowej. Treść tej strony internetowej jest dynamiczna. Przez dynamiczne rozumiem rozumiem, że strona internetowa ładuje więcej informacji podczas przewijania w dół do dołu strony. Zawartość HTML zmienia się podczas przewijania do dolnej części strony. Niestety obiekt Web Browser Object nie aktualizuje automatycznie tych informacji. Nadal ma oryginalny dokument, który najpierw załadowano za pomocą funkcji webbrowser.navigate. Zaktualizowane informacje są dostępne dla HTMLElementCollection.

Poniższy kod nie działa dla mnie.

webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml 

Zerwałam powyższe stwierdzenie następująco

Dim eCollections As HtmlElementCollection 
    Dim strDoc As String 
    eCollections = WB.Document.GetElementsByTagName("HTML") 
    strDoc = eCollections(0).OuterHtml 

Pracował jak czar. Mam nadzieję, że to też pomaga komuś.

+0

Dziękuję. To mi pomogło. – user1422348

0

Innym sposobem jest ustawienie licznika czasu na formularzu, a następnie, gdy licznik trafi, strona zostanie ponownie wyświetlona i można przeanalizować stronę.

-1

Można uzyskać

webBrowser1.Document.Body.OuterHtml

Powiązane problemy