Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按HtmlAlityPack列出的字数_C#_Web Scraping_Html Agility Pack - Fatal编程技术网

C# 按HtmlAlityPack列出的字数

C# 按HtmlAlityPack列出的字数,c#,web-scraping,html-agility-pack,C#,Web Scraping,Html Agility Pack,我需要得到一个网页上的总字数。此方法返回336的数字。但是当我从wordcounter.net手动检查时,大约是1192个单词。我怎样才能得到这篇文章的字数呢 int kelimeSayisi() { Uri url = new Uri("https://www.fitekran.com/hamilelik-ve-spor-hamileyken-hangi-spor-nasil-yapilir/"); WebClient clien

我需要得到一个网页上的总字数。此方法返回336的数字。但是当我从wordcounter.net手动检查时,大约是1192个单词。我怎样才能得到这篇文章的字数呢

int kelimeSayisi()
        {
            Uri url = new Uri("https://www.fitekran.com/hamilelik-ve-spor-hamileyken-hangi-spor-nasil-yapilir/");
            WebClient client = new WebClient();
            client.Encoding = System.Text.Encoding.UTF8;
            string html = client.DownloadString(url);
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(html);

            var kelime = doc.DocumentNode.SelectNodes("//text()").Count;
            return kelime;
        }

正如HereticMonkey在评论中提到的,您只检索文本节点的总数,因此需要计算
InnerText
中的单词。此外,您还可能想做一些其他事情:

  • 只查看页面的正文
  • 排除脚本节点,这样就不会返回JavaScript
我已经编写了一个修改版本的代码,它可以做到这一点,并通过在空格字符上拆分来计算单词,并且只将以字母开头的字符串视为单词:

int kelimeSayisi()
{
    Uri url = new Uri("https://www.fitekran.com/hamilelik-ve-spor-hamileyken-hangi-spor-nasil-yapilir/");
    WebClient client = new WebClient();
    client.Encoding = System.Text.Encoding.UTF8;
    string html = client.DownloadString(url);
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(html);

    char[] delimiter = new char[] {' '};
    int kelime = 0;
    foreach (string text in doc.DocumentNode
        .SelectNodes("//body//text()[not(parent::script)]")
        .Select(node => node.InnerText))
    {
        var words = text.Split(delimiter, StringSplitOptions.RemoveEmptyEntries)
            .Where(s => Char.IsLetter(s[0]));
        int wordCount = words.Count();
        if (wordCount > 0)
        {
            Console.WriteLine(String.Join(" ", words));
            kelime += wordCount;
        }
    }
    return kelime;
}

这将返回1487的总字数,并将被视为单词的所有内容写入控制台,以便您可以查看所包含的内容。可能是wordcounter.net排除了一些诸如页眉和页脚之类的内容。

该代码获取的是文本节点的数量,而不是这些文本节点中的单词数量。迭代文本节点,获取它们的值,然后使用。@HereticMonkey我对网页抓取是个新手。关于这个问题,你能帮我更多的忙吗。你所说的“迭代文本节点,获取它们的值”是什么意思?好吧,这只是简单的旧C#,但类似于
foreach(doc.DocumentNode.SelectNodes(“//text()”)。Select(node=>node.InnerText)){/*对文本做点什么*/}
@HereticMonkey非常感谢。