HTML Çeviklik paketi nasıl kullanılır?


629

HTML Çeviklik Paketini nasıl kullanırım ?

XHTML dokümanım tamamen geçerli değil. Bu yüzden kullanmak istedim. Projemde nasıl kullanırım? Projem C # dilinde.


79
Bu soru bana çok yardımcı oldu.
BigJoe714

26
Yan Not: NuGet'i işleyen bir Visual Studio ile artık "Referanslar" ı sağ tıklayıp "NuGet Paketlerini Yönet ..." i seçebilir, "HtmlAgilityPack" i arayabilir ve "Yükle" yi tıklayabilirsiniz. Sonra bir using / Import deyimi ile kod ile oynamaya başlayın.
patridge

@Patridge tarafından yapılan yukarıdaki yorum ile ilgili olarak: Projeyi skhn'den ankhsvn yoluyla ilk getirirken HtmlAgilityPack'e referansımı kaldırmam ve yeniden eklemem gerektiğine karar verdim.
Andrew Coonce

14
HTMLAgilityPack'i arayan herkes CsQuery'i düşünmelidir, benim deneyimimden çok daha modern bir arayüze sahip çok daha yeni bir kütüphane. Örneğin, ilk cevaptaki kodun tamamı CsQuery'de olarak özetlenebilir var body = CQ.CreateFromFile(filePath)["body"].
Benjamin Gruenbaum

2
@BenjaminGruenbaum: CsQuery önerileriniz için başparmaklarınızı kaldırın - dakikalar içinde kurun, kullanımı çok kolay.
Neolisk

Yanıtlar:


358

İlk olarak, yüklemek HTMLAgilityPack projenize Nuget paketi.

Sonra, örnek olarak:

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

(Not: Bu kod yalnızca bir örnektir ve mutlaka en iyi / tek yaklaşım değildir. Kendi uygulamanızda körü körüne kullanmayın.)

HtmlDocument.Load()Yöntem ayrıca, .NET çerçevesinde diğer akış yönlendirilmiş sınıfları ile entegre çok yararlı olan bir akım kabul eder. Süre HtmlEntity.DeEntitize()html varlıklarını doğru işlemek için başka bir yararlı yöntemdir. (teşekkürler Matthew)

HtmlDocumentve HtmlNode en çok kullanacağınız sınıflardır. XML ayrıştırıcısına benzer şekilde, XPath ifadelerini kabul eden selectSingleNode ve selectNodes yöntemlerini sağlar.

HtmlDocument.Option?????? Boole özelliklerine dikkat edin . Bunlar, Loadve LoadXMLyöntemlerinin HTML / XHTML'nizi nasıl işleyeceğini denetler .

HtmlAgilityPack.chm adlı nesnelerin her biri için tam bir referansa sahip derlenmiş bir yardım dosyası da vardır. Bu normalde çözümün temel klasöründedir.


11
Load öğesinin, birçok durumda uygun olan bir Stream parametresini kabul ettiğini de unutmayın. Bir HTTP akışı (WebResponse.GetResponseStream) için kullandım. Dikkat edilmesi gereken bir diğer iyi yöntem HtmlEntity.DeEntitize (HTML Çeviklik Paketi'nin bir parçasıdır). Bazı durumlarda varlıkları manuel olarak işlemek için bu gereklidir.
Matthew Flaschen

1
not: Html Agility Pack'in en son beta sürümünde (3 Ekim 2009'da yayınlanan 1.4.0 Beta 2) yardım dosyası Sandcastle, DocProject ve Visual Studio 2008 SDK'ya bağımlılıklar nedeniyle ayrı bir indirmeye taşındı.
rtpHarry

SelectSingleNode() bir süre önce kaldırılmış gibi görünüyor
Chris S

3
Hayır, SelectSingleNode ve SelectNodes kesinlikle orada. HtmlDoc.ParseErrors.Count () değil, biraz ilginç buluyorum .Count
Mike Blandford

1
@MikeBlandford // Kısmen evet. HtmlAgailityPack'in PCL sürümünde kaldırılmış (veya en baştan beri yok) görünüyor. nuget.org/packages/HtmlAgilityPack-PCL
Joon Hong

166

Bunun size yardımcı olup olmayacağını bilmiyorum, ancak temelleri tanıtan birkaç makale yazdım.

Sonraki makale% 95 tamamlandı, sadece yazdığım kodun son birkaç bölümünün açıklamalarını yazmam gerekiyor. Eğer ilgileniyorsanız o zaman ben yayınlamak burada buraya hatırlamak çalışacağız.



3
Son zamanlarda Code Project'te çok iyi bir HTMLAgilityPack makalesi yayınlandı. Buradan
Victor Sigler

64

HtmlAgilityPack XPath sözdizimini kullanır ve pek çoğu bunun belgelenmediğini iddia etse de, bu XPath belgelerinin yardımıyla kullanmakta sorun yaşamadım: https://www.w3schools.com/xml/xpath_syntax.asp

Ayrıştırmak için

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

Bunu ben yaptım:

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

Tamamen doğru. Tamamen XPathstandarda bağlıdır . Kişi önce bu standardı öğrenmeli ve bundan sonra her şey kolay olacak.
FindOut_Quran

Verdiğiniz bağlantı artık mevcut değil. Muhtemelen yeni olan: w3schools.com/xsl/xpath_syntax.asp
Piotrek

Ayrıca DocumentNode nesnesinde herhangi bir SelectNodes () işlevi göremiyorum. Yeniden adlandırıldı mı?
Piotrek

Hangi sürümü kullanıyorsunuz ve nereden indirdiniz? Htmlagilitypack.codeplex.com/SourceControl/latest#Release/1_4_0/… ' a göre , HtmlNode sınıfında bir SelectNodes yöntemi olmalıdır.
Kent Munthe Caspersen

Bağlantı mevcut değil, yeni bağlantı: www.w3schools.com/xml/xpath_syntax.asp
Tyrmos

6

HTMLAgilityPack ile ilgili ana kod aşağıdaki gibidir

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
Web sitesi artık mevcut değil
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

Başlarken - HTML Çeviklik Paketi

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

bunu dene

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;
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.