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

carla
sumber
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.

Abu
sumber
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.

rtpHarry
sumber
16
Akhirnya selesai artikel itu dua tahun kemudian :) Metode mudah untuk mendeteksi RSS dan feed Atom di situs web dengan HtmlAgilityPack
rtpHarry
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);
}
Kent Munthe Caspersen
sumber
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;
        }
    }
}
captainsac
sumber
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";
        }

    }
ibrahim ozboluk
sumber
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);
Meysam
sumber
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;
        }
PK-1825
sumber