Cách sử dụng gói Agility HTML


629

Làm cách nào để sử dụng Gói Agility HTML ?

Tài liệu XHTML của tôi không hoàn toàn hợp lệ. Đó là lý do tại sao tôi muốn sử dụng nó. Làm thế nào để tôi sử dụng nó trong dự án của tôi? Dự án của tôi là trong C #.


79
Câu hỏi này rất hữu ích với tôi.
BigJoe714

26
Lưu ý bên lề: với Visual Studio xử lý NuGet, giờ đây bạn có thể nhấp chuột phải vào "Tài liệu tham khảo" và chọn "Quản lý gói NuGet ...", tìm kiếm "HtmlAgilityPack" và nhấp vào "Cài đặt". Sau đó, ngay lập tức chơi với mã bằng câu lệnh sử dụng / Nhập.
patridge

Về nhận xét trên của @patridge: Tôi thấy rằng tôi cần phải xóa và sau đó thêm lại tham chiếu của mình vào HtmlAgilityPack khi lần đầu tiên tìm nạp dự án từ svn qua ankhsvn.
Andrew Coonce

14
Bất cứ ai tìm hiểu về HTMLAgilityPack đều nên xem xét CsQuery, đây là một thư viện mới hơn nhiều với giao diện hiện đại hơn nhiều từ kinh nghiệm của tôi. Ví dụ: toàn bộ mã từ câu trả lời đầu tiên có thể được tóm tắt trong CsQuery như var body = CQ.CreateFromFile(filePath)["body"].
Benjamin Gruenbaum

2
@BenjaminGruenbaum: Thumbs up cho đề xuất CsQuery của bạn - thiết lập trong vài phút, rất dễ sử dụng.
Neolisk

Câu trả lời:


358

Đầu tiên, cài đặt gói nuget HTMLAgilityPack vào dự án của bạn.

Sau đó, như một ví dụ:

HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();

// There are various options, set as needed
htmlDoc.OptionFixNestedTags=true;

// filePath is a path to a file containing the html
htmlDoc.Load(filePath);

// Use:  htmlDoc.LoadHtml(xmlString);  to load from a string (was htmlDoc.LoadXML(xmlString)

// ParseErrors is an ArrayList containing any errors from the Load statement
if (htmlDoc.ParseErrors != null && htmlDoc.ParseErrors.Count() > 0)
{
    // Handle any parse errors as required

}
else
{

    if (htmlDoc.DocumentNode != null)
    {
        HtmlAgilityPack.HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//body");

        if (bodyNode != null)
        {
            // Do something with bodyNode
        }
    }
}

(NB: Mã này là một ví dụ duy nhất và không nhất thiết là cách tiếp cận tốt nhất / duy nhất. Đừng sử dụng nó một cách mù quáng trong ứng dụng của riêng bạn.)

Các HtmlDocument.Load()phương pháp cũng chấp nhận một dòng suối mà là rất hữu ích trong việc tích hợp với các lớp học định hướng dòng khác trong khuôn khổ NET. Trong khi HtmlEntity.DeEntitize()là một phương pháp hữu ích khác để xử lý các thực thể html chính xác. (cảm ơn Matthew)

HtmlDocumentHtmlNode là các lớp bạn sẽ sử dụng nhiều nhất. Tương tự như trình phân tích cú pháp XML, nó cung cấp các phương thức selectSingleNode và selectNodes chấp nhận các biểu thức XPath.

Hãy chú ý đến các HtmlDocument.Option?????? thuộc tính boolean. Những điều khiển này kiểm soát cách thức LoadLoadXMLphương thức sẽ xử lý HTML / XHTML của bạn.

Ngoài ra còn có một tệp trợ giúp được biên dịch có tên là HtmlAgilityPack.chm có một tài liệu tham khảo đầy đủ cho từng đối tượng. Điều này là bình thường trong thư mục cơ sở của giải pháp.


11
Cũng lưu ý rằng Load chấp nhận tham số Stream, thuận tiện trong nhiều tình huống. Tôi đã sử dụng nó cho một luồng HTTP (WebResponse.GetResponseStream). Một phương pháp tốt khác cần lưu ý là HtmlEntity.DeEntitize (một phần của Gói Agility HTML). Điều này là cần thiết để xử lý các thực thể bằng tay trong một số trường hợp.
Matthew Flaschen

1
lưu ý: trong bản beta mới nhất của Html Agility Pack (1.4.0 Beta 2 phát hành ngày 3 tháng 10 năm 2009), tệp trợ giúp đã được chuyển sang một bản tải xuống riêng vì phụ thuộc vào Sand Castle, DocProject và Visual Studio 2008 SDK.
rtpHarry

SelectSingleNode() dường như đã bị xóa cách đây một thời gian
Chris S

3
Không, SelectSingleNode và SelectNodes chắc chắn vẫn còn đó. Tôi thấy một điều thú vị là nó phải là htmlDoc.PudeErrors.Count (), chứ không phải .Count
Mike Blandford

1
@MikeBlandford // Một phần có. Nó dường như bị xóa (hoặc không tồn tại từ đầu) tại phiên bản PCL của HtmlAgailityPack. nuget.org/packages/HtmlAgilityPack-PCL
Joon Hong

166

Tôi không biết điều này có giúp ích gì cho bạn không, nhưng tôi đã viết một vài bài viết giới thiệu những điều cơ bản.

Bài viết tiếp theo đã hoàn thành 95%, tôi chỉ cần viết lên những lời giải thích về một vài phần cuối của mã tôi đã viết. Nếu bạn quan tâm thì tôi sẽ cố gắng nhớ đăng ở đây khi tôi xuất bản nó.



3
Gần đây trong Code Project, nó đã được phát hành một bài viết rất hay về HTMLAgilityPack. Bạn có thể đọc nó ở đây
Victor Sigler

64

HtmlAgilityPack sử dụng cú pháp XPath và mặc dù nhiều ý kiến ​​cho rằng nó được ghi chép kém, tôi không gặp khó khăn gì khi sử dụng nó với sự trợ giúp từ tài liệu XPath này: https://www.w3schools.com/xml/xpath_syntax.asp

Để phân tích

<h2>
  <a href="">Jack</a>
</h2>
<ul>
  <li class="tel">
    <a href="">81 75 53 60</a>
  </li>
</ul>
<h2>
  <a href="">Roy</a>
</h2>
<ul>
  <li class="tel">
    <a href="">44 52 16 87</a>
  </li>
</ul>

Tôi đã làm điều này:

string url = "http://website.com";
var Webget = new HtmlWeb();
var doc = Webget.Load(url);
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//h2//a"))
{
  names.Add(node.ChildNodes[0].InnerHtml);
}
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//li[@class='tel']//a"))
{
  phones.Add(node.ChildNodes[0].InnerHtml);
}

Hoàn toàn đúng. Nó hoàn toàn phụ thuộc vào XPathtiêu chuẩn. Trước tiên bạn nên học tiêu chuẩn đó và mọi thứ sẽ trở nên dễ dàng sau đó.
FindOut_Quran

Liên kết mà bạn cung cấp không còn có sẵn. Đây có lẽ là cái mới: w3schools.com/xsl/xpath_syntax.asp
Piotrek

ngoài ra tôi không thể thấy bất kỳ hàm SelectNodes () nào trong đối tượng DocumentNode. Có đổi tên không?
Piotrek

Phiên bản nào bạn đang sử dụng và bạn đã tải xuống từ đâu? Theo htmlagilitypack.codeplex.com/SourceControl/latest#Release/1_4_0/ trên nên có một phương thức SelectNodes trên lớp HtmlNode.
Kent Munthe Caspersen

Liên kết không có sẵn, liên kết mới: www.w3schools.com/xml/xpath_syntax.asp
Tyrmos

6

Mã chính liên quan đến HTMLAgilityPack như sau

using System;
using System.Net;
using System.Web;
using System.Web.Services;
using System.Web.Script.Services;
using System.Text.RegularExpressions;
using HtmlAgilityPack;

namespace GetMetaData
{
    /// <summary>
    /// Summary description for MetaDataWebService
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
    [System.Web.Script.Services.ScriptService]
    public class MetaDataWebService: System.Web.Services.WebService
    {
        [WebMethod]
        [ScriptMethod(UseHttpGet = false)]
        public MetaData GetMetaData(string url)
        {
            MetaData objMetaData = new MetaData();

            //Get Title
            WebClient client = new WebClient();
            string sourceUrl = client.DownloadString(url);

            objMetaData.PageTitle = Regex.Match(sourceUrl, @
            "\<title\b[^>]*\>\s*(?<Title>[\s\S]*?)\</title\>", RegexOptions.IgnoreCase).Groups["Title"].Value;

            //Method to get Meta Tags
            objMetaData.MetaDescription = GetMetaDescription(url);
            return objMetaData;
        }

        private string GetMetaDescription(string url)
        {
            string description = string.Empty;

            //Get Meta Tags
            var webGet = new HtmlWeb();
            var document = webGet.Load(url);
            var metaTags = document.DocumentNode.SelectNodes("//meta");

            if (metaTags != null)
            {
                foreach(var tag in metaTags)
                {
                    if (tag.Attributes["name"] != null && tag.Attributes["content"] != null && tag.Attributes["name"].Value.ToLower() == "description")
                    {
                        description = tag.Attributes["content"].Value;
                    }
                }
            } 
            else
            {
                description = string.Empty;
            }
            return description;
        }
    }
}

4
Trang web này không còn khả dụng
Dimitar Tsonev

5
    public string HtmlAgi(string url, string key)
    {

        var Webget = new HtmlWeb();
        var doc = Webget.Load(url);
        HtmlNode ourNode = doc.DocumentNode.SelectSingleNode(string.Format("//meta[@name='{0}']", key));

        if (ourNode != null)
        {


                return ourNode.GetAttributeValue("content", "");

        }
        else
        {
            return "not fount";
        }

    }

0

Bắt đầu - Gói Agility HTML

// From File
var doc = new HtmlDocument();
doc.Load(filePath);

// From String
var doc = new HtmlDocument();
doc.LoadHtml(html);

// From Web
var url = "http://html-agility-pack.net/";
var web = new HtmlWeb();
var doc = web.Load(url);

0

thử cái này

string htmlBody = ParseHmlBody(dtViewDetails.Rows[0]["Body"].ToString());

private string ParseHmlBody(string html)
        {
            string body = string.Empty;
            try
            {
                var htmlDoc = new HtmlDocument();
                htmlDoc.LoadHtml(html);
                var htmlBody = htmlDoc.DocumentNode.SelectSingleNode("//body");
                body = htmlBody.OuterHtml;
            }
            catch (Exception ex)
            {

                dalPendingOrders.LogMessage("Error in ParseHmlBody" + ex.Message);
            }
            return body;
        }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.