2014-06-09 11 views
8

Làm cách nào để tôi có thể xóa dữ liệu được tạo động bằng JavaScript trong tài liệu html bằng C#?Cắt dữ liệu được tạo động bởi JavaScript trong tài liệu html bằng C#

Sử dụng WebRequestHttpWebResponse trong thư viện C#, tôi có thể nhận được toàn bộ mã nguồn html dưới dạng chuỗi, nhưng khó khăn là dữ liệu tôi muốn không được chứa trong mã nguồn; dữ liệu được tạo động bởi JavaScript.

Mặt khác, nếu dữ liệu tôi muốn đã có trong mã nguồn, thì tôi có thể dễ dàng sử dụng chúng bằng cách sử dụng Cụm từ thông dụng.

Tôi đã tải HtmlAgilityPack, nhưng tôi không biết nếu nó sẽ chăm sóc các trường hợp mục được tạo động bởi JavaScript ...

Cảm ơn bạn rất nhiều!

+0

Bạn sẽ phải chạy qua một công cụ JavaScript. Có lẽ một cái gì đó như [Awesomium] (http://www.awesomium.com/)? –

+0

Hãy xem tại đây: http://stackoverflow.com/questions/18539491/headless-browser-and-scraping-solutions – sagibb

Trả lời

10

Khi bạn đặt WebRequest, bạn yêu cầu máy chủ cung cấp cho bạn tệp trang, nội dung của tệp này chưa được phân tích cú pháp/thực thi bởi trình duyệt web và do đó javascript trên đó chưa thực hiện bất kỳ điều gì.

Bạn cần sử dụng công cụ để thực thi JavaScript trên trang nếu bạn muốn xem trang trông như thế nào sau khi được trình duyệt phân tích cú pháp. Một tùy chọn bạn có là sử dụng tính năng kiểm soát trình duyệt web được tích hợp sẵn .net: http://msdn.microsoft.com/en-au/library/aa752040(v=vs.85).aspx

Điều khiển trình duyệt web có thể điều hướng đến trang và sau đó bạn có thể truy vấn DOM sẽ bị thay đổi bởi JavaScript trên trang.

EDIT (ví dụ):

Uri uri = new Uri("http://www.somewebsite.com/somepage.htm"); 

webBrowserControl.AllowNavigation = true; 
// optional but I use this because it stops javascript errors breaking your scraper 
webBrowserControl.ScriptErrorsSuppressed = true; 
// you want to start scraping after the document is finished loading so do it in the function you pass to this handler 
webBrowserControl.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowserControl_DocumentCompleted); 
webBrowserControl.Navigate(uri); 

private void webBrowserControl_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    HtmlElementCollection divs = webBrowserControl.Document.GetElementsByTagName("div"); 

    foreach (HtmlElement div in divs) 
    { 
     //do something 
    } 
} 
+0

Cảm ơn bạn rất nhiều. Bạn có thể đưa ra một số mẹo về phương pháp/chức năng nào trong điều khiển trình duyệt web mà tôi cần (để điều hướng, tải và truy vấn) không? Cảm ơn một lần nữa. :) – user3213711

+0

Tôi đã chỉnh sửa câu trả lời của mình để bao gồm một ví dụ. – Pandepic

+0

Có cách nào để sử dụng WebBrowser trong chương trình không phải giao diện người dùng không? Tôi cần phải phân tích một trang web, được tạo ra một phần bởi javascript, nhưng tôi không cần giao diện người dùng. – Spook

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