Mit HtmlAgilityPack ein HTML-Element anhand der ID oder der Klasse entfernen

Die populäre Komponente HtmlAgilityPack dient dazu, in C# eine Zeichenfolge als HTML zu parsen und darin, ähnlich einem XML-Dokument, Operationen auszuführen.

Mit nachfolgendem Code könnt Ihr anhand eines Klassen-Names oder einer Element-ID nach Elementen suchen.

namespace ZetaProducer.RuntimeBusinessLogic.Webbing.Printing
{
    using System;
    using System.Linq;
    using HtmlAgilityPack;

    internal static class PrintAgilityPackExtensions
    {
        public static void RemoveElementsByClass(this HtmlDocument doc, string className)
        {
            var nodes = doc.DocumentNode.SelectNodes(string.Format(@"//*[contains(@class,'{0}')]", className));
            if (nodes != null)
            {
                foreach (var node in nodes)
                {
                    if (node != null)
                    {
                        // Muss ganze Klasse haben.
                        var classes = node.Attributes[@"class"].Value;
                        if (containsFullWord(classes, className))
                        {
                            var parent = node.ParentNode;
                            if (parent != null)
                            {
                                parent.RemoveChild(node);
                            }
                        }
                    }
                }
            }
        }

        private static bool containsFullWord(string classes, string className)
        {
            if (string.IsNullOrWhiteSpace(classes) || string.IsNullOrWhiteSpace(className))
            {
                return false;
            }
            else
            {
                classes = classes.Trim();
                className = className.Trim();

                var raw = classes.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                return raw.Any(s => string.Equals(s, className));
            }
        }

        public static void RemoveElementsByID(this HtmlDocument doc, string id)
        {
            var nodes = doc.DocumentNode.SelectNodes(string.Format(@"//*[@id='{0}']", id));
            if (nodes != null)
            {
                foreach (var node in nodes)
                {
                    var parent = node.ParentNode;
                    if (parent != null)
                    {
                        parent.RemoveChild(node);
                    }
                }
            }
        }
    }
}

Original aus meinem Pastebin.

Eine Alternative zu HtmlAgilityPack ist HtmlParserSharp.

Bin auf diese Seite gestoßen, weil ich auf der Suche nach einer „modernen“ Community bin… Aber dann sehe ich gleich diesen Beitrag; der mich sehr enttäuscht. Jeder C#-ler der das HAP benutzt, hat irgendwie die Zeit verschlafen / oder von HTML wenig Ahnung. HAP folgt keinen HTML5 Regeln und baut auch keinen DOM der Spezifikationen folgt.

Immer wenn irgendwo HAP empfohlen wird, sagt das was über den Poster aus. Einfach mal schreiben, ohne richtig informiert zu sein. Entweder CsQuery (baut auf HtmlParserSharp auf) oder noch besser: AngleSharp. Beides HTML5 konform und AngleSharp baut sogar nen DOM nach offiziellen Regeln auf.

1 Like

Das ist eine interessante Antwort von dir, die ich so bisher noch nie gehört habe. In meiner Erinnerung waren alle Antworten auf Stack Overflow diesbezüglich immer, dass HtmlAgilityPack das Tool der Wahl ist.

Was genau sind die konkreten Nachteile in der Praxis?

HAP wird nicht mehr aktiv gewartet. HAP erzeugt keinen W3C validaten DOM. HAP fehlen wichtige Features und HAP verwendet XPath anstatt CSS Queries.

Allein schon, dass HAP nicht HTML5 konform ist, sollte jedem Entwickler zu denken geben. Versuch allein mal die Google Error Page zu parsen. Völlig falsches Ergebnis …

1 Like

Ich verwende das auch viel in unserem Programmierer http://www.Zeta-Producer.com

Dann schaue ich mir mal CsQuery an.

Danke schön :smile:

Meine persönliche Wahl ist AngleSharp. Das wäre vom Aufbau noch ähnlicher zu HAP.

1 Like