You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HtmlAgilityPack统计网页单词数偏差:如何获取文章准确词数?

解决网页文章内容单词数统计问题

你的代码现在有两个核心问题导致统计结果和手动统计偏差极大:

  • 你用SelectNodes("//text()").Count统计的是HTML文本节点的数量,不是单词数——每个文本节点可能包含多个单词,这直接让结果远小于实际值。
  • 没有过滤网页里的非文章内容(比如导航栏、侧边栏、页脚、广告文本等),只统计了零散文本节点的数量,自然和手动统计的文章正文单词数不符。

下面是修正后的实现步骤和代码:

步骤1:定位文章正文的容器节点

先分析目标网页的HTML结构(可以用浏览器开发者工具检查元素),找到包裹文章内容的专属容器。对你提供的URL来说,文章正文在class为entry-content的div节点里。

步骤2:提取并合并正文文本

从定位到的容器节点中提取所有文本内容,合并成一个完整的字符串,完全忽略其他无关节点的文本。

步骤3:准确统计单词数

用正则表达式处理标点、多空格等情况,匹配符合常规定义的单词(包括土耳其语这类带特殊变音符号的单词),避免统计无效的标点或空白字符。

修正后的代码

using System;
using System.Net;
using HtmlAgilityPack;
using System.Text.RegularExpressions;

int kelimeSayisi() {
    Uri url = new Uri("https://www.fitekran.com/hamilelik-ve-spor-hamileyken-hangi-spor-nasil-yapilir/");
    using 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 articleNode = doc.DocumentNode.SelectSingleNode("//div[@class='entry-content']");
    if (articleNode == null)
        return 0; // 找不到节点时返回0,也可根据需求做异常处理
    
    // 提取并合并正文所有文本
    string articleText = articleNode.InnerText.Trim();
    
    // 统计单词数:匹配所有字母/数字序列(支持带变音符号的语言)
    var matches = Regex.Matches(articleText, @"[\p{L}\p{N}]+", RegexOptions.Compiled);
    
    return matches.Count;
}

代码说明

  • 用using包裹WebClient,确保网络资源正确释放。
  • 精准定位文章容器,彻底排除导航、广告等无关文本的干扰。
  • 正则表达式[\p{L}\p{N}]+能匹配所有语言的字母和数字序列,完美适配土耳其语的特殊字符(比如ğ、ş等),统计结果和手动统计的真实单词数高度一致。

内容的提问来源于stack exchange,提问作者maliyassi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 07:37:35