Thứ Năm, 18 tháng 4, 2019

HtmlAgilityPack Example-Extract Href

Đăng Bởi: Admin - tháng 4 18, 2019 - 0 Bình Luận


Dễ dàng trích xuất các liên kết từ một đoạn html với HtmlAgilityPack


https://onedrive.live.com/?id=15F731B049C8A797%21442&cid=15F731B049C8A797




HtmlAgilityPack Example-Extract Href


https://articles.runtings.co.uk/2009/11/easily-extracting-links-from-snippet-of.html

https://articles.runtings.co.uk/2009/11/easily-extracting-links-from-snippet-of.html

https://onedrive.live.com/?id=15F731B049C8A797%21442&cid=15F731B049C8A797




Dễ dàng trích xuất các liên kết từ một đoạn html với HtmlAgilityPack

HtmlAgilityPack là một thư viện mạnh mẽ giúp cho việc quét màn hình trong asp.net trở nên dễ dàng. Đây là phần thứ hai trong loạt bài tiếp tục mà tôi trình bày một cách để bạn trích xuất tất cả các liên kết từ một đoạn html.

Một chút nền tảng

Nếu bạn chưa nghe về HtmlAgilityPack thì bạn đã vào nhầm bài. Đi qua phần giới thiệu của tôi về chủ đề và sau đó quay lại và gặp tôi khi bạn đã đọc nó.

Ứng dụng mẫu sẽ hoạt động như thế nào

Ứng dụng mẫu sẽ lấy một đoạn html lộn xộn được lưu trữ trong một tệp văn bản. Chúng tôi sẽ tải nó vào và phân tích tất cả các thẻ <a href=""> và trình bày các liên kết này trong trình duyệt bằng cách ràng buộc chúng với chế độ xem lưới.
Hãy xem đoạn trích html mà chúng tôi sẽ tải:
~ / App_Data / HtmlSnippet.txt
<table Border = "0" cellpadding = "2" cellspaces = "7" style = "vertical-align: top;"> <tr> <td width = "80" align = "centre" valign = "top"> < font style = "font-size: 85%; font-family: arial, sans-serif"> <a href = "http://news.google.com/news/url?fd=R&sa=T&url = http% 3,3% 2 %% /XrArEKXhTe6dLM/6.jpg "alt =" "Border =" 1 "width =" 80 "height =" 80 "/> <br /> <font size =" - 2 "> Times Online </ font> </ a > </ font> </ td> <td valign = "top"> <font style = "font-size: 85%; font-family:arial, sans-serif "> <br /> <div style =" padding-top: 0.8em; "> <img alt =" "height =" 1 "width =" 1 "/> </ div> <div> <a href = "http://news.google.com/news/url?fd=R&sa=T&url=http%3A%2F%2Fwww.latimes.com%2Fnews%2Fnationworld%2Fnation%2Fla-na -health-coop20-2009aug20% 2C0% 2C4258832.story & amp; usg = AFQjCNG4LI_9w3yHg7H8ZqUBaKNwzpgiuA "> <b> Các hợp tác chăm sóc sức khỏe đang nổi lên như là thay thếcom% 2Fnews% 2Fnationworld% 2Fnation% 2Fla-na-Health-coop20-2009aug20% 2C0% 2C4258832.story & amp; usg = AFQjCNG4LI_9w3yHg7H8Zqa - bắn tỉa ->com% 2Fnews% 2Fnationworld% 2Fnation% 2Fla-na-Health-coop20-2009aug20% 2C0% 2C4258832.story & amp; usg = AFQjCNG4LI_9w3yHg7H8Zqa - bắn tỉa ->
Vâng, đó không phải là tất cả nhưng tôi nghĩ rằng bạn có được điểm. Giống như tôi đã nói đoạn trích này ban đầu đến từ một câu hỏi diễn đàn. Bản thân html đến từ những gì trông giống như một nguồn cấp tin tức của Google. Tôi đã giữ nó cho bài viết này vì nó cho thấy HtmlAgilityPack có thể xử lý mã lộn xộn và nó cũng sẽ không bị vấp bởi các url bổ sung được mã hóa url.
Cách tiếp cận thông thường của việc sử dụng biểu thức chính quy để trích xuất loại thông tin này có thể bị lừa bởi loại mã này. Tôi không phải là một fan hâm mộ lớn của việc sử dụng các biểu thức thông thường để trích xuất loại thông tin này vì chúng quá dễ vỡ (nhưng tôi là một fan hâm mộ lớn của các biểu thức thông thường).

Cấu trúc chính của chương trình

Đây là mã cho phương thức Page_Load cho sự nhìn chăm chú của bạn. Nó sẽ cung cấp cho bạn ý tưởng về các bước chính mà chương trình này thực hiện để hoàn thành các nhiệm vụ của mình:
được bảo vệ void Page_Load (người gửi đối tượng, EventArss e)
{
    // tải đoạn trích
    HtmlDocument htmlSnippet = new HtmlDocument ();
    htmlSnippet = LoadHtmlSnippetFromFile ();

    // trích xuất
    Danh sách <chuỗi> hrefTags = Danh sách mới <chuỗi> ();
    hrefTags = Extract ALLAHrefTags (htmlSnippet);

    // liên kết với Gridview
    GridViewHrefs.DataSource = hrefTags;
    GridViewHrefs.DataBind ();
}
Vì vậy, như bạn có thể thấy, cần ba bước chính - tải đoạn mã html vào hệ thống, phân tích cú pháp và giai đoạn mỹ phẩm cuối cùng để liên kết nó với GridView.
Trong dòng đầu tiên bạn thấy rằng chúng ta tạo một thể hiện của lớp HtmlDocument. Đây là một lớp đi kèm với thư viện HtmlAgilityPack. Đây là lớp chính mà bạn sử dụng để lưu trữ một HtmlDocument hoàn chỉnh.
Điều này mang lại cho chúng ta độc đáo với LoadHtmlSnippetFromFile ();

Đang tải đoạn mã html từ tệp

Phương thức thứ hai chúng ta sẽ xem xét là LoadHtmlSnippetFromFile ();
Đây là một phương pháp khá đơn giản, tải trong phiên bản đầy đủ của đoạn mã html lộn xộn khủng khiếp mà tôi đã trình bày trước đó. Tuy nhiên, điều này không có nghĩa là nó không mang tính giáo dục. Hãy xem:
/// <tóm tắt>
/// Tải đoạn mã html từ tệp txt
/// </ Tóm tắt>
riêng tư HtmlDocument LoadHtmlSnippetFromFile ()
{
    Trình đọc TextReader = File.OpenText (Server.MapPath ("~ / App_Data / HtmlSnippet.txt"));

    HtmlDocument doc = new HtmlDocument ();
    doc.Load (người đọc);

    người đọc. Đóng ();

    trả lại tài liệu;
}
Vì vậy, như bạn có thể thấy, tôi đã sử dụng một trong nhiều lớp trình đọc luồng để dễ dàng tải tệp txt đoạn trích html vào bộ nhớ.
Biến luồng văn bản html này thành một tài liệu có thể truy vấn là nhiệm vụ của phương thức Load () trên HtmlDocument. Nếu bạn chọc ngoáy với intellisense trên phương thức đó, bạn sẽ thấy rằng nó có 10 lần quá tải sẽ cho phép chúng tôi đường dẫn, luồng hoặc TextReaders với các tùy chọn mã hóa khác nhau.
Nếu bạn đã có nội dung của tài liệu html chứa trong chuỗi (chẳng hạn như từ dịch vụ web) thì bạn có thể sử dụng LoadHtml ().
Có một tùy chọn thứ ba mà HtmlAgilityPack hỗ trợ và đó là truy xuất trang qua internet thông qua một url. Điều này được thể hiện trong bài viết tiếp theo giải thích cách bạn có thể kiểm tra xem một trang web có chứa nguồn cấp dữ liệu rss hoặc nguyên tử hay không, nhưng bây giờ nó sẽ vẫn là một bí ẩn trêu ngươi.
Tôi không cần phải nói điều đó nhưng đừng quên. Đóng () luồng của bạn sau khi bạn đã điền vào HtmlDocument.

Trích xuất tất cả các thẻ href từ tài liệu

Đây là phần mà tất cả chúng ta đã chờ đợi - đó là phần mà phép thuật phân tích cú pháp html được thực hiện. Và mặc dù đây là một phương pháp đơn giản, nhưng nó thực sự cho thấy nhiều khối xây dựng chính mà bạn sẽ sử dụng trong các nỗ lực cạo màn hình của mình.
/// <tóm tắt>
/// Trích xuất tất cả các thẻ neo bằng HtmlAgilityPack
/// </ Tóm tắt>
/// <param name = "htmlSnippet"> </ param>
/// <trả về> </ trả về>
Danh sách riêng <chuỗi> Extract ALLAHrefTags (HtmlDocument htmlSnippet)
{
    Danh sách <chuỗi> hrefTags = Danh sách mới <chuỗi> ();

    foreach (liên kết HtmlNode trong htmlSnippet.DocumentNode.SelectNodes ("// a [@href]"))
    {
        HtmlAttribution att = link.Attribution ["href"];
        hrefTags.Add (att.Value);
    }

    return hrefTags;
}
Nhìn vào mã một số điều trở nên rõ ràng:
  • Lớp HtmlDocument chứa một tập hợp các HtmlNodes
  • Các HtmlNodes này có thể được chọn bằng truy vấn XPath
  • HtmlNodes sau đó có thể được hỏi thuộc tính theo thuộc tính với lớp HtmlAttribution.
Sử dụng ba yếu tố này, tôi đã trích xuất một danh sách tất cả các href trong đoạn mã html.
Việc sử dụng XPath để trích xuất thông tin ra khỏi các tài liệu html là chìa khóa cho sức mạnh của HtmlAgilityPack. Nếu bạn không biết XPath là gì thì đó là một công nghệ đi cùng với xml và cung cấp ngôn ngữ truy vấn để trích xuất các nút xml ra khỏi các tài liệu xml.
Các tài liệu XML phải hợp lệ để được truy vấn và hầu hết các html trên web đều không hợp lệ. Nó được rải rác với các thẻ không rõ ràng, viết hoa và lỗi cú pháp. Việc triển khai XPath bình thường không thể được sử dụng để truy vấn html trừ khi bạn dọn sạch nó trước. Điều tuyệt vời về điều này trong HtmlAgilityPack là việc triển khai sẽ cố gắng hết sức để trích xuất thông tin bất kể tính hợp lệ của tài liệu.
Điều này cho chúng ta một cách rất biểu cảm để mô tả thông tin mà chúng ta muốn trích xuất. Trong thực tế đối với nhiều dự án, bạn sẽ thấy rằng phần khó nhất là tìm ra truy vấn XPath chính xác để mô tả chính xác những gì bạn muốn.
Truy vấn của chúng tôi // a [@href] có nghĩa là chọn tất cả các thẻ (thẻ neo html) có thuộc tính href (vì vậy đừng chọn neo nếu nó chỉ là một neo có tên).
Bộ sưu tập kết quả sau đó được lặp lại trong vòng lặp foreach nơi tôi đọc thuộc tính href từ mỗi thẻ và đưa nó vào bộ sưu tập cuối cùng của tôi để ghi dữ liệu.
Chúng tôi đã đề cập đến rất nhiều nền tảng trong rất ít mã mà tôi hy vọng sẽ gây ấn tượng hơn nữa với bạn về sức mạnh của thư viện này.
Điều chỉnh trong thời gian tới để tìm hiểu làm thế nào chúng tôi sẽ xây dựng một công cụ truy vấn có thể phát hiện nếu một trang web có nguồn cấp dữ liệu rss hoặc nguyên tử được liên kết với nó!

Tải ứng dụng mẫu

Ứng dụng mẫu chứa mọi thứ chúng ta đã thảo luận trong bài viết này, bao gồm HtmlAgilityPack, mã và tệp đoạn trích html.

Thêm trong loạt bài này

Bài viết này là một phần của một loạt. Bạn có thể tìm thấy nhiều bài viết trong loạt bài này ở đây:










Phản Hồi Độc Giả

Một số lưu ý khi bình luận

Mọi bình luận sai nội quy sẽ bị xóa mà không cần báo trước (xem nội quy)

Bấm Thông báo cho tôi bên dưới khung bình luận để nhận thông báo khi admin trả lời

Để bình luận một đoạn code, hãy mã hóa code trước nhé