Mit HTML Agility Pack nur den Text einer Webseite abrufen?

c# html-agility-pack

Frage

Ich versuche eine Webseite zu scrappen, um nur den Text zu erhalten. Ich lege jedes Wort in ein Wörterbuch und zähle, wie oft jedes Wort auf der Seite erscheint. Ich versuche HTML Agility Pack so zu verwenden, wie es in diesem Post vorgeschlagen wird: Wie bekomme ich die Anzahl der Wörter auf einer Webseite?

HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load(url);
int wordCount = 0;
Dictionary<string, int> dict = new Dictionary<string, int>();

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//text()"))
{
    MatchCollection matches = Regex.Matches(node.InnerText, @"\b(?:[a-z]{2,}|[ai])\b", RegexOptions.IgnoreCase);
    foreach (Match s in matches)
    {
       //Add the entry to the dictionary
    }
}

Mit meiner aktuellen Implementierung erhalte ich jedoch immer noch viele Ergebnisse, die aus dem Markup stammen, das nicht gezählt werden sollte. Es ist nah, aber noch nicht ganz da (ich erwarte nicht, dass es perfekt ist).

Ich benutze diese Seite als Beispiel. Meine Ergebnisse zeigen eine Menge der Verwendungen der Wörter "width" und "googletag", obwohl diese nicht im eigentlichen Text der Seite enthalten sind.

Irgendwelche Vorschläge, wie Sie das beheben können? Vielen Dank!

Beliebte Antwort

Sie können nicht sicher sein, dass das Wort, nach dem Sie suchen, dem Benutzer angezeigt wird oder nicht, da JS-Ausführung und CSS-Regeln dies beeinflussen werden.

Das folgende Programm findet 0 Übereinstimmungen für "width" und "googletag", findet aber 126 Übereinstimmungen mit "html", während Chrome Ctrl + F 106 Übereinstimmungen findet.

Beachten Sie, dass das Programm nicht mit dem Wort übereinstimmt, wenn der Elternknoten <script> .

using HtmlAgilityPack;
using System;

namespace WordCounter
{
    class Program
    {
        private static readonly Uri Uri = new Uri("https://www.w3schools.com/html/html_editors.asp");

        static void Main(string[] args)
        {
            var doc = new HtmlWeb().Load(Uri);
            var nodes = doc.DocumentNode.SelectSingleNode("//body").DescendantsAndSelf();
            var word = Console.ReadLine().ToLower();
            while (word != "exit")
            {
                var count = 0;
                foreach (var node in nodes)
                {
                    if (node.NodeType == HtmlNodeType.Text && node.ParentNode.Name != "script" && node.InnerText.ToLower().Contains(word))
                    {
                        count++;
                    }
                }

                Console.WriteLine($"{word} is displayed {count} times.");
                word = Console.ReadLine().ToLower();
            }
        }
    }
}


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum