2013-08-09 16 views
8

Tôi đang cố gắng tìm phương thức truy cập dữ liệu giữa các thẻ được máy chủ trả về mà tôi đang thực hiện yêu cầu HTTP. Tài liệu có nhiều thẻ, nhưng chỉ một trong các thẻ có mã JavaScript giữa nó, phần còn lại được bao gồm trong các tệp. Tôi muốn truy cập mã giữa thẻ tập lệnh.Phân tích HTML để nhận giá trị biến của tập lệnh

Một ví dụ của mã này là:

<html> 
    // Some HTML 

    <script> 
     var spect = [['temper', 'init', []], 
        ['fw\/lib', 'init', [{staticRoot: '//site.com/js/'}]], 
        ["cap","dm",[{"tackmod":"profile","xMod":"timed"}]]]; 

    </script> 

    // More HTML 
</html> 

Tôi đang tìm kiếm một cách lý tưởng để lấy dữ liệu giữa 'SPECT và phân tích nó. Đôi khi có một khoảng trống giữa 'spect' và '=' và đôi khi không có. Không có ý tưởng tại sao, nhưng tôi không có quyền kiểm soát máy chủ.

Tôi biết câu hỏi này có thể đã được hỏi, nhưng câu trả lời đề xuất sử dụng một cái gì đó như HTMLAgilityPack và tôi muốn tránh sử dụng thư viện cho tác vụ này vì tôi chỉ cần nhận JavaScript từ DOM một lần.

+2

đó chính xác là lý do bạn sử dụng nó, với 2 hoặc 3 dòng mã bạn có thể trích xuất nội dung tập lệnh đó bằng HTMLAgilityPack và sau đó phân tích cú pháp bằng regex hoặc thậm chí là bộ đánh giá JavaScript để nhận giá trị của quang phổ. phân tích cú pháp bằng regex. – Prix

+0

Xin lỗi, nhưng nếu bạn không thể tự viết mã trong 5 phút, có thể dấu hiệu của vấn đề phức tạp hơn bạn nghĩ ban đầu - đó là lý do tại sao các giải pháp tồn tại tồn tại :). Thật khó để xem mục tiêu của bạn thực sự là gì - bạn có muốn học cái gì mới, bạn có bất kỳ hạn chế rõ ràng nào không sử dụng các thư viện bên ngoài không, bạn có muốn thực hành viết một loại mã cụ thể không? –

+0

Tôi đã giải quyết nó bằng cách viết một biểu thức chính quy, sẽ trả lời câu hỏi của chính bạn trong giây lát. Lý do tôi muốn tránh sử dụng một thư viện vì đây là điểm duy nhất trong ứng dụng tôi sẽ cần phải phân tích cú pháp bit này của JavaScript. Tôi nghĩ đó là một thực tế tồi tệ khi sử dụng một thư viện cho nhiệm vụ này khi lý thuyết nó có thể không có. Lý do tại sao tôi hỏi là để tìm hiểu những gì các tùy chọn khác có thể có sẵn để giải quyết vấn đề này. Tôi phải đối mặt với vấn đề này nhiều lần trong các dự án khác và thường kết thúc bằng cách sử dụng CsQuery hoặc HTMLAgilityPack, nhưng đối với một cuộc gọi này tôi muốn tránh chúng thư viện. –

Trả lời

15

dụ Rất đơn giản về cách này có thể dễ dàng sử dụng một HTMLAgilityPackJurassic library để đánh giá kết quả:

var html = @"<html> 
      // Some HTML 
      <script> 
       var spect = [['temper', 'init', []], 
       ['fw\/lib', 'init', [{staticRoot: '//site.com/js/'}]], 
       [""cap"",""dm"",[{""tackmod"":""profile"",""xMod"":""timed""}]]]; 
      </script> 
      // More HTML 
      </html>"; 

// Grab the content of the first script element 
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml(html); 
var script = doc.DocumentNode.Descendants() 
          .Where(n => n.Name == "script") 
          .First().InnerText; 

// Return the data of spect and stringify it into a proper JSON object 
var engine = new Jurassic.ScriptEngine(); 
var result = engine.Evaluate("(function() { " + script + " return spect; })()"); 
var json = JSONObject.Stringify(engine, result); 

Console.WriteLine(json); 
Console.ReadKey(); 

Output:

[[ "bình tĩnh", "init", []], ["fw/lib", "init", [{"staticRoot": "// site.com/js/"}]],["cap","dm",[{"tackmod": "hồ sơ", "xMod": "đã hẹn giờ"}]]]

Lưu ý: Tôi không hạch toán lỗi hoặc bất cứ điều gì khác, điều này chỉ đơn thuần là một ví dụ về cách lấy tập lệnh và đánh giá giá trị của quang phổ.

Có một số thư viện khác để thực thi/đánh giá JavaScript.

+0

Mặc dù tôi đã chọn sử dụng cụm từ thông dụng, tôi thực sự thích câu trả lời này vì tôi chưa bao giờ sử dụng Jurassic và nó chắc chắn sẽ có ích trong các dự án trong tương lai. –

+0

Cung cấp cho tôi lỗi về nơi – Cannon

+0

@buffer_overflow tạo câu hỏi mới với sự cố của bạn và tôi chắc chắn một số câu hỏi sẽ giúp bạn giải quyết vấn đề này. – Prix