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
相关产品推荐
相关产品推荐

