Question Comment utiliser le pack HTML Agility


Comment puis-je utiliser le Pack d'agilité HTML?

Mon document XHTML n'est pas complètement valide. C'est pourquoi je voulais l'utiliser. Comment l'utiliser dans mon projet? Mon projet est en C #.


586
2018-05-11 06:50


origine


Réponses:


D'abord, installez le HTMLAgilityPack paquet de nuget dans votre projet.

Ensuite, à titre d'exemple:

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: Ce code est un exemple seulement et pas nécessairement la meilleure / seule approche.Ne l'utilisez pas aveuglément dans votre propre application.)

le HtmlDocument.Load() La méthode accepte également un flux qui est très utile pour s'intégrer avec d'autres classes orientées flux dans le framework .NET. Tandis que HtmlEntity.DeEntitize() est une autre méthode utile pour traiter les entités html correctement. (merci Matthew)

HtmlDocument et HtmlNode  sont les classes que vous utiliserez le plus. Similaire à un analyseur XML, il fournit les méthodes selectSingleNode et selectNodes qui acceptent les expressions XPath.

Faites attention au HtmlDocument.Option??????  propriétés booléennes. Ceux-ci contrôlent comment le Load et LoadXML les méthodes traiteront votre HTML / XHTML.

Il y a aussi un fichier d'aide compilé appelé HtmlAgilityPack.chm qui contient une référence complète pour chacun des objets. C'est normalement dans le dossier de base de la solution.


337
2018-05-11 07:19



Je ne sais pas si cela vous sera utile, mais j'ai écrit quelques articles qui présentent les bases.

L'article suivant est complet à 95%, je dois juste écrire des explications sur les dernières parties du code que j'ai écrites. Si vous êtes intéressé alors je vais essayer de me souvenir de poster ici quand je le publie.


160
2018-04-06 22:59



HtmlAgilityPack utilise la syntaxe XPath, et bien que beaucoup affirment qu'elle est mal documentée, je n'ai eu aucun problème à l'utiliser avec l'aide de cette documentation XPath: https://www.w3schools.com/xml/xpath_syntax.asp

Pour analyser

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

J'ai fait ça:

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

62
2017-07-08 16:17



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

    }

4
2017-12-06 11:33



Le code principal HTMLAgilityPack est le suivant

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
2017-08-02 07:00



Mise en route - HTML Agility Pack

// 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
2017-10-24 14:21