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

如何处理HTML特殊字符(如★)?HtmlAgilityPack编码问题

解决HTML特殊字符提取乱码(★变★)的问题

这个乱码问题我之前也碰到过,根源是字符编码不匹配:★的UTF-8编码字节序列是E2 98 85,当这段字节被错误地当成ISO-8859-1(Latin-1)解码时,就会变成你看到的★。下面给你几个针对性的解决办法:

一、从加载阶段就搞定编码(最彻底的方案)

HtmlAgilityPack默认可能会错误推断页面编码,导致后续提取的文本编码混乱。你需要在加载HTML文档时明确指定正确的编码(一般是UTF-8):

如果是从网页加载HTML

直接用HtmlWeb强制指定编码:

var web = new HtmlWeb();
web.OverrideEncoding = Encoding.UTF8; // 强制用UTF-8,或者用响应返回的编码
var DOM = web.Load("你的目标页面URL");

如果是从字符串或本地文件加载

要确保加载时用UTF-8解析:

var htmlContent = "你的HTML字符串内容";
var DOM = new HtmlDocument();
// 先把字符串转成UTF-8字节,再加载避免编码错误
DOM.LoadHtml(Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(htmlContent)));

二、已提取文本的应急修复

如果已经加载了文档且编码错了,可以把乱码的文本转回来:

// 把错误解码的字符串转成ISO-8859-1字节,再用UTF-8重新解码
var wrongBytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(Listing.InnerText.Trim());
var correctTitle = Encoding.UTF8.GetString(wrongBytes);
// 之后再处理HTML实体解码(如果有的话)
correctTitle = HttpUtility.HtmlDecode(correctTitle);

三、优化你的原有代码

结合上面的方案,修改你的遍历逻辑:

// 先确保DOM加载时用对编码
var web = new HtmlWeb();
web.OverrideEncoding = Encoding.UTF8;
var DOM = web.Load("目标页面URL");

var Nodes = DOM.DocumentNode.SelectNodes("//td[@class = 'description']/a");
var listTest = new List<DataContext>();

foreach (var Listing in Nodes)
{
    // 加载编码正确的话,InnerText已经是正常的了
    var ListingTitle = Listing.InnerText.Trim();
    // 只有当文本里有HTML实体(比如&amp;)时,才需要用HtmlDecode
    // ListingTitle = HttpUtility.HtmlDecode(ListingTitle);
    
    Console.WriteLine(ListingTitle);
    
    // 处理逗号替换
    Title = ListingTitle.Contains(',') ? ListingTitle.Replace(',', '.') : ListingTitle;
    
    // 其他业务逻辑...
}

额外提醒

  • HttpUtility.HtmlDecode是用来解码HTML实体的(比如把&amp;转成&),它管不了字符编码的问题,别指望用它解决乱码。
  • 优先解决加载阶段的编码匹配,这是从根源上避免乱码的方法,应急转码只是临时修复手段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:03:24