C# 使用HTML Agility Pack仅获取网页文本?

C# 使用HTML Agility Pack仅获取网页文本?,c#,html-agility-pack,C#,Html Agility Pack,我正试图刮一个网页来获取文本。我把每个单词都放到字典里,然后计算每个单词出现在页面上的次数。我正在尝试使用本文建议的HTML Agility Pack: HtmlWeb=newhtmlweb(); HtmlDocument doc=web.Load(url); int字数=0; Dictionary dict=新字典(); foreach(doc.DocumentNode.SelectNodes(“//text()”)中的HtmlNode节点) { MatchCollection matches

我正试图刮一个网页来获取文本。我把每个单词都放到字典里,然后计算每个单词出现在页面上的次数。我正在尝试使用本文建议的HTML Agility Pack:

HtmlWeb=newhtmlweb();
HtmlDocument doc=web.Load(url);
int字数=0;
Dictionary dict=新字典();
foreach(doc.DocumentNode.SelectNodes(“//text()”)中的HtmlNode节点)
{
MatchCollection matches=Regex.matches(node.InnerText,@“\b(?[a-z]{2,}|[ai])\b”,RegexOptions.IgnoreCase);
foreach(匹配中的匹配)
{
//将条目添加到字典中
}
}
然而,在我当前的实现中,我仍然从标记中得到了很多不应该统计的结果。它很接近,但还不太接近(我不认为它是完美的)

我举个例子。我的结果显示了“宽度”和“谷歌标签”这两个词的很多用法,尽管它们根本不在页面的实际文本中


有没有关于如何解决这个问题的建议?谢谢

你不能确定你正在搜索的单词是否显示给用户,因为会有JS执行和CSS规则影响到这一点

下面的程序确实为“宽度”和“谷歌标签”找到了0个匹配项,但找到了126个“html”匹配项,而Chrome Ctrl+F找到了106个匹配项

请注意,如果程序的父节点是
,则程序与单词不匹配

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