2011-09-07 39 views
14

Tôi có một trang ASP.NET và một số lớp tùy chỉnh tìm nạp trang web đã chỉ định và trả về thân trang này.Làm cách nào để hiển thị html (được xử lý bằng Javascript) trong điều khiển 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; 
    } 

Nhưng những gì tôi cần - nó nhận được DOM html, thay vì nguồn., Vì tôi thực hiện thêm một số thao tác trên DOM bằng jQuery.

+1

Vì vậy, những gì bạn cần là html DOM sau javascript đã sửa đổi nó?Bạn có muốn nó như một chuỗi? –

Trả lời

15

Dưới đây là một trong những giải pháp tôi thấy để có được HTML rendered (DOM) sau khi javascript đã chạy:

Đặt một điều khiển WebBrowser tên webBrowser1 trên mẫu của lớp Form1.

[Form1.cs [Thiết kế]]

Sau đó cho mã sử dụng:

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

Thay đổi webBrowser1.Navigate (" http://localhost:6489/Default.aspx ") tham số trong Form1_Load đến trang có DOM sau khi được xử lý bởi javascript bạn muốn có được.

Bạn có thể truy cập vào DOM sửa đổi trong phương pháp CallServerSideCode(), ví dụ:

doc.GetElementById("myDataTable"); 

Hoặc bạn có thể truy cập vào HTML rendered như thế này:

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

đó là một câu trả lời tuyệt vời Răzvan Panda !!! Tôi đã sử dụng mã của bạn để đọc một số phản ứng tổng hợp lạnh tự động hiển thị trang và nó hoạt động cho đến khi tôi phải xây dựng lại syetem của mình. NGAY BÂY GIỜ, tôi không thể thấy dữ liệu được hiển thị thực tế (bên trong/bên ngoài) html không trả về những gì tôi thấy. có một địa điểm hoặc phương pháp khác mà tôi có thể sử dụng để gỡ bỏ nó không ?? – CocoaNewBee

+0

@CocoaNewBee: Tôi không biết cách nào khác, tôi đã học cách này để truy cập nó bằng cách nghiên cứu. Cách bạn mô tả nó, giống như, bạn không thể có được nó theo cách khác. –

+3

Tại sao không làm điều đó trong webBrowser1_DocumentCompleted như webBrowser1.Document.GetElementsByTagName ("HTML") [0] .OuterHtml – George

4

Như George nói trong một trong những các nhận xét, về lý thuyết bạn chỉ có thể lấy DOM trong webBrowser1_DocumentCompleted bằng cách chỉ sử dụng:

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

Công trình này không có trò đùa. –

2

Đầu tiên là một nền tảng nhỏ. Tôi đã cố gắng để cạo thông tin từ một trang web. Nội dung của trang web này là động. Điều tôi ngụ ý bằng năng động là trang web tải thêm thông tin khi bạn cuộn xuống cuối trang. Nội dung HTML thay đổi khi bạn cuộn xuống cuối trang. Thật không may là đối tượng trình duyệt web không tự động cập nhật thông tin này. Nó vẫn có tài liệu gốc đầu tiên được tải qua chức năng webbrowser.navigate. Thông tin cập nhật có sẵn cho HTMLElementCollection.

Mã sau không hoạt động đối với tôi.

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

tôi chia tay tuyên bố trên như sau

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

Làm việc như một nét duyên dáng. Hy vọng điều này sẽ giúp một ai đó quá.

+0

Cảm ơn bạn. Điều này đã giúp tôi. – user1422348

0

Một cách khác là đặt hẹn giờ trên biểu mẫu, sau đó khi bộ đếm thời gian truy cập, trang sẽ được hiển thị lại và bạn có thể phân tích cú pháp trang.

-1

Bạn có thể nhận

webBrowser1.Document.Body.OuterHtml

Các vấn đề liên quan