Cara menggunakan paket Agility HTML


629

Bagaimana cara menggunakan Paket Agility HTML ?

Dokumen XHTML saya tidak sepenuhnya valid. Itu sebabnya saya ingin menggunakannya. Bagaimana saya menggunakannya dalam proyek saya? Proyek saya ada di C #.


79
Pertanyaan ini sangat membantu saya.
BigJoe714

26
Catatan Sisi: dengan Visual Studio yang menangani NuGet, Anda sekarang dapat mengklik kanan "Referensi" dan memilih "Kelola Paket NuGet ...", cari "HtmlAgilityPack" dan klik "Instal". Kemudian langsung bermain dengan kode dengan menggunakan / Impor pernyataan.
patridge

Mengenai komentar di atas oleh @patridge: Saya menemukan bahwa saya perlu menghapus dan kemudian menambahkan kembali referensi saya ke HtmlAgilityPack ketika pertama kali mengambil proyek dari svn melalui ankhsvn.
Andrew Coonce

14
Siapa pun yang melihat ke HTMLAgilityPack harus mempertimbangkan CsQuery, ini adalah perpustakaan yang jauh lebih baru dengan antarmuka yang jauh lebih modern dari pengalaman saya. Misalnya, seluruh kode dari jawaban pertama dapat diringkas dalam CsQuery as var body = CQ.CreateFromFile(filePath)["body"].
Benjamin Gruenbaum

2
@BenjaminGruenbaum: Jempol untuk saran CsQuery Anda - disiapkan dalam hitungan menit, sangat mudah digunakan.
Neolisk

Jawaban:


358

Pertama, instal paket nuget HTMLAgilityPack ke proyek Anda.

Kemudian, sebagai contoh:

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: Kode ini adalah contoh saja dan belum tentu pendekatan yang terbaik / satu-satunya. Jangan menggunakannya secara membabi buta dalam aplikasi Anda sendiri.)

The HtmlDocument.Load()Metode juga menerima aliran yang sangat berguna dalam mengintegrasikan dengan kelas berorientasi aliran lain dalam rangka NET. Sedangkan HtmlEntity.DeEntitize()metode lain yang berguna untuk memproses entitas html dengan benar. (terima kasih Matthew)

HtmlDocumentdan HtmlNode kelas yang paling sering Anda gunakan. Mirip dengan parser XML, ia menyediakan metode selectSingleNode dan selectNodes yang menerima ekspresi XPath.

Perhatikan HtmlDocument.Option?????? properti boolean. Ini mengontrol bagaimana Loaddan LoadXMLmetode akan memproses HTML / XHTML Anda.

Ada juga file bantuan yang dikompilasi yang disebut HtmlAgilityPack.chm yang memiliki referensi lengkap untuk masing-masing objek. Ini biasanya di folder dasar dari solusi.


11
Perhatikan juga bahwa Load menerima parameter Stream, yang nyaman dalam banyak situasi. Saya menggunakannya untuk aliran HTTP (WebResponse.GetResponseStream). Metode lain yang baik untuk diperhatikan adalah HtmlEntity.DeEntitize (bagian dari HTML Agility Pack). Ini diperlukan untuk memproses entitas secara manual dalam beberapa kasus.
Matthew Flaschen

1
catatan: dalam versi beta terbaru dari Html Agility Pack (1.4.0 Beta 2 dirilis 3 Oktober 2009) file bantuan telah dipindahkan ke unduhan terpisah karena ketergantungan pada Sandcastle, DocProject dan Visual Studio 2008 SDK.
rtpHarry

SelectSingleNode() tampaknya telah dihapus beberapa waktu lalu
Chris S

3
Tidak, SelectSingleNode dan SelectNodes pasti masih ada. Saya merasa sedikit menarik bahwa itu seharusnya htmlDoc.ParseErrors.Count (), bukan .Count
Mike Blandford

1
@ MikeBlandford // Sebagian ya. Tampaknya dihapus (atau tidak ada sejak awal) di versi PCL dari HtmlAgailityPack. nuget.org/packages/HtmlAgilityPack-PCL
Joon Hong

166

Saya tidak tahu apakah ini akan membantu Anda, tetapi saya telah menulis beberapa artikel yang memperkenalkan dasar-dasarnya.

Artikel selanjutnya selesai 95%, saya hanya perlu menuliskan penjelasan beberapa bagian terakhir dari kode yang saya tulis. Jika Anda tertarik maka saya akan mencoba mengingat untuk memposting di sini ketika saya menerbitkannya.



3
Baru-baru ini di Proyek Code telah dirilis artikel yang sangat bagus dari HTMLAgilityPack. Anda dapat membacanya di sini
Victor Sigler

64

HtmlAgilityPack menggunakan sintaks XPath, dan meskipun banyak yang berpendapat bahwa dokumentasinya buruk, saya tidak kesulitan menggunakannya dengan bantuan dari dokumentasi XPath ini: https://www.w3schools.com/xml/xpath_syntax.asp

Mengurai

<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>

Saya melakukan ini:

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);
}

Sepenuhnya benar. Ini sepenuhnya tergantung pada XPathstandar. Pertama-tama orang harus belajar standar itu dan semuanya akan mudah setelah itu.
FindOut_Quran

Tautan yang Anda berikan tidak lagi tersedia. Ini mungkin yang baru: w3schools.com/xsl/xpath_syntax.asp
Piotrek

juga saya tidak bisa melihat fungsi SelectNodes () di objek DocumentNode. Apakah diganti namanya?
Piotrek

Versi apa yang Anda gunakan dan dari mana Anda mengunduhnya? Menurut htmlagilitypack.codeplex.com/SourceControl/latest#Release/1_4_0/… seharusnya ada metode SelectNodes pada kelas HtmlNode.
Kent Munthe Caspersen

Tautan tidak tersedia, tautan baru: www.w3schools.com/xml/xpath_syntax.asp
Tyrmos

6

Kode utama HTMLAgilityPack terkait adalah sebagai berikut

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
Situs web tidak lagi tersedia
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

Memulai - Paket HTML Agility

// 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

coba ini

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;
        }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.