Получите только текст веб-страницы, используя HTML Agility Pack?

c# html-agility-pack

Вопрос

Я пытаюсь очистить веб-страницу, чтобы получить только текст. Я помещаю каждое слово в словарь и подсчитываю, сколько раз каждое слово появляется на странице. Я пытаюсь использовать HTML Agility Pack, как предлагается из этого сообщения: Как получить количество слов на веб-странице?

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

Однако, с моей текущей реализацией, я все еще получаю много результатов, которые относятся к разметке, которую не следует учитывать. Это близко, но не совсем там (я не ожидаю, что это будет идеально).

Я использую эту страницу в качестве примера. Мои результаты показывают много применений слов «ширина» и «googletag», несмотря на то, что они вообще не находятся в фактическом тексте страницы.

Любые предложения по устранению этого? Благодаря!

Популярные ответы

Вы не можете быть уверены, что слово, которое вы ищете, отображается пользователю или нет, так как будут выполняться JS-исполнение и правила CSS, которые повлияют на это.

Следующая программа находит 0 совпадений для «width» и «googletag», но находит 126 «html» совпадений, тогда как Chrome Ctrl + F находит 106 совпадений.

Обратите внимание, что программа не соответствует слову, если это родительский узел <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();
            }
        }
    }
}


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему