2009-02-12 28 views
20

Tôi có ứng dụng C# WPF cần tiêu thụ dữ liệu được hiển thị trên trang web dưới dạng bảng HTML.C# Có LINQ to HTML hay một số API thao tác HTML .Net tốt khác không?

After getting inspiration from this url Tôi đã thử sử dụng LINQ to Xml để phân tích cú pháp tài liệu Html, nhưng điều này chỉ hoạt động nếu tài liệu HTML được tạo hình rất tốt (và không có bất kỳ nhận xét hoặc thực thể HTML nào bên trong). Tôi đã quản lý để có được một giải pháp làm việc bằng cách sử dụng kỹ thuật này, nhưng nó là xa lý tưởng.

Tôi là một giải pháp nhằm phân tích cú pháp HTML. Tôi đã hack "giải pháp" trước đây, nhưng chúng rất giòn. Tôi là một cách phân tích cú pháp/thao túng tài liệu. Tôi lý tưởng như một cái gì đó mà làm cho nhiệm vụ dễ dàng như nó sẽ được từ Javascript/JQuery.

Có ai biết thư viện hoặc tiện ích .Net tốt để phân tích cú pháp/thao tác HTML không?

+0

làm thế nào bạn nhận được html? Thông qua kiểm soát webbrowser, hoặc thông qua một HttpRequest, hoặc ...? –

+0

Xin chào, tôi đang nhận HTML thông qua HttpRequest. –

Trả lời

12

Mặc dù nó không LINQ dựa, Tôi đề nghị nghiên cứu các HTML Agility Pack từ CodePlex.

Lưu ý: Html Agility Pack bây giờ hỗ trợ LINQ to Objects (thông qua một LINQ to Xml giao diện Giống như)

Từ trang HTML Agility Pack:

Đây là một phân tích cú pháp HTML nhanh nhẹn mà xây dựng một DOM đọc/ghi và hỗ trợ XPath hoặc XSLT thuần túy (bạn thực sự không cần phải hiểu XPath cũng như XSLT để sử dụng nó, đừng lo lắng ...). Nó là một thư viện mã .NET cho phép bạn phân tích cú pháp "ra khỏi web" các tệp HTML. Trình phân tích cú pháp rất khoan dung với HTML không đúng định dạng "thế giới thực". Mô hình đối tượng rất giống với những gì đề xuất System.Xml, nhưng đối với các tài liệu HTML (hoặc các luồng).

+1

Bạn đã sử dụng sản phẩm này với thành công chưa? –

+0

Giấy phép phức tạp của nó có nghĩa là gì? –

+0

Có, tôi đã sử dụng thư viện này trong một vài năm nay với kết quả tuyệt vời. Tôi rất muốn giới thiệu nó cho bất cứ ai. Nó cũng đi kèm trong một gói Nuget, rất hữu ích. –

2

HTML hiếm khi được hình thành đủ để bạn có thể sử dụng LINQ to XML một cách đáng tin cậy. Đó là có thể tưởng tượng được mà bạn có thể tìm thấy một "trình dọn dẹp" HTML có thể sửa định dạng đủ tốt để đọc, nhưng không cho biết mức độ mạnh mẽ của nó.

Tôi cho rằng đây là "màn hình" đọc từ bảng HTML mà bạn không có quyền kiểm soát. Đừng căng thẳng vì sự mạnh mẽ trong trường hợp này, việc cạo màn hình vốn đã giòn. Nếu các yêu cầu của bạn được đặt trong đá, hãy thiết kế scraper để dễ dàng cập nhật nếu/khi HTML bạn đang cạo các thay đổi.

2

Tôi phải làm điều này trong một dự án gần đây và tôi đã sử dụng LINQ to XML. Nếu bạn biết nó sẽ luôn sạch sẽ XHTML thì bạn có thể sao chép dễ dàng DOM một cách dễ dàng, nhưng tôi đã sử dụng thư viện lớp DevComponents HTMLDocument (http://www.devcomponents.com/htmldoc/) để chuyển đổi HTML thành XML rồi kéo nó vào một XElement. Điều này làm giảm thách thức để đưa HTML của bạn vào hệ thống phân cấp XElement. Một trong những báo trước là nó chokes trên các yếu tố kịch bản, vì vậy tôi đã xóa những người bằng vũ lực.

/// <summary> 
    /// Extracts an HtmlDocument DOM to an XElement DOM that can be queried using LINQ to XML. 
    /// </summary> 
    /// <param name="htmlDocument">HtmlDocument containing DOM of page to extract.</param> 
    /// <returns>HTML content as <see cref="XElement" /> for consumption by LINQ to XML.</returns> 
    public XElement ExtractXml(HtmlDocument htmlDocument) { 
     XmlDocument xmlDoc = htmlDocument.ToXMLDocument(); 

     // Find and remove all script tags from XML DOM or LINQ to XML will choke on XElement.Parse(XmlDocument). 
     IList<XmlNode> nodes = new List<XmlNode>(); 
     foreach (XmlNode node in xmlDoc.GetElementsByTagName("script")) 
      nodes.Add(node); 
     foreach (XmlNode node in nodes) 
      node.ParentNode.RemoveChild(node); 

     return XElement.Parse(xmlDoc.OuterXml); 
    } 
Các vấn đề liên quan