Количество слов по HtmlAgilityPack - PullRequest
1 голос
/ 30 марта 2020

Мне нужно получить общее количество слов на веб-странице. Этот метод возвращает число 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;
        }

1 Ответ

0 голосов
/ 31 марта 2020

Как упомянул 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, а также записывает на консоль все, что рассматривается как слово, чтобы вы могли просмотреть, что включено. Возможно, это слово. net исключает несколько вещей, таких как верхние и нижние колонтитулы.

...