2009-03-17 49 views
45

Tôi muốn sử dụng gói nhanh nhẹn HTML để phân tích các bảng từ các trang web phức tạp, nhưng bằng cách nào đó tôi bị mất trong mô hình đối tượng.HTML Agility pack - các bảng phân tích cú pháp

Tôi đã xem ví dụ về liên kết nhưng không tìm thấy bất kỳ dữ liệu bảng nào theo cách này. Tôi có thể sử dụng XPath để lấy các bảng không? Tôi về cơ bản bị mất sau khi tải dữ liệu về cách lấy các bảng. Tôi đã làm điều này trong Perl trước và nó hơi vụng về, nhưng đã làm việc. (HTML::TableParser).

Tôi cũng rất vui nếu người ta chỉ có thể làm sáng một thứ tự đúng đối tượng để phân tích cú pháp.

Trả lời

96

Làm thế nào về một cái gì đó như: Sử dụng HTML Agility Pack

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(@"<html><body><p><table id=""foo""><tr><th>hello</th></tr><tr><td>world</td></tr></table></body></html>"); 
foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table")) { 
    Console.WriteLine("Found: " + table.Id); 
    foreach (HtmlNode row in table.SelectNodes("tr")) { 
     Console.WriteLine("row"); 
     foreach (HtmlNode cell in row.SelectNodes("th|td")) { 
      Console.WriteLine("cell: " + cell.InnerText); 
     } 
    } 
} 

Lưu ý rằng bạn có thể làm cho nó đẹp hơn với LINQ-to-Đối tượng nếu bạn muốn: những gì

var query = from table in doc.DocumentNode.SelectNodes("//table").Cast<HtmlNode>() 
      from row in table.SelectNodes("tr").Cast<HtmlNode>() 
      from cell in row.SelectNodes("th|td").Cast<HtmlNode>() 
      select new {Table = table.Id, CellText = cell.InnerText}; 

foreach(var cell in query) { 
    Console.WriteLine("{0}: {1}", cell.Table, cell.CellText); 
} 
+1

Xin chào Mark, bạn có thể xin lời khuyên về phân tích các tệp lớn không? Hơn 50 mb tệp, tôi không thể tìm nạp các nút con trên các tệp lớn hơn –

+0

@Marc - nếu bảng đang phân trang, sau đó làm cách nào để truy cập trang tiếp theo bằng cách cạo? –

+0

@Dark_Knight bạn cần nhấn bất kỳ tuyến đường ajax nào mà trang gốc đã sử dụng –

31

Các đơn giản nhất mà tôi đã tìm thấy để có được XPath cho một Element cụ thể là cài đặt phần mở rộng FireBug cho Firefox, hãy vào trang web/trang web nhấn F12 để đưa ra firebug; chọn đúng và nhấp chuột phải vào phần tử trên trang mà bạn muốn truy vấn và chọn "Kiểm tra phần tử" Firebug sẽ chọn phần tử trong IDE của nó rồi nhấp chuột phải vào phần tử trong Firebug và chọn "Sao chép XPath" chức năng này sẽ cung cấp cho bạn XPath chính xác Truy vấn bạn cần lấy phần tử bạn muốn sử dụng Thư viện Agility HTML.

+3

Hãy nhớ rằng đôi khi trình duyệt sẽ thay đổi DOM của html một chút - như thêm vào một

nếu thiếu. Gói nhanh nhẹn Html theo mặc định cũng sẽ không bao gồm các thẻ và