C# 和 HtmlAgilityPack 的编码问题

24
WebClient GodLikeClient = new WebClient();
HtmlAgilityPack.HtmlDocument GodLikeHTML = new HtmlAgilityPack.HtmlDocument();

GodLikeHTML.Load(GodLikeClient.OpenRead("www.alfa.lt");
所以这段代码返回:"Skaitytojo klausimas psichologui: kas lemia homoseksualumÄ…? - Naujienų portalas Alfa.lt" 而不是 "Skaitytojo klausimas psichologui: kas lemia homoseksualumą? - Naujienų portalas Alfa.lt"。
这个网页使用的编码是1257(波罗的海),但是textBox1.Text = GodLikeHTML.DocumentNode.OuterHtml;返回了扭曲的文本——波罗的海变音符号被转换成了一些奇怪的几个字符长的字符串:(。
是的,我已经尝试过HtmlAgilityPack论坛了。它们确实很糟糕。
附言:我不是程序员,但我在一个社区项目上工作,我真的需要让这段代码工作起来。谢谢;})
9个回答

25

实际上,该页面采用UTF-8编码。

GodLikeHTML.Load(GodLikeClient.OpenRead("http://www.alfa.lt"), Encoding.UTF8);

会起作用。

或者你可以使用我在这个SO答案中提供的代码,它可以从http头或meta标签中检测编码并进行适当的重新编码。(它还支持gzip以最小化下载量)。

有了下载类,你的代码将如下所示:

HttpDownloader downloader = new HttpDownloader("http://www.alfa.lt",null,null);
GodLikeHTML.LoadHtml(downloader.GetPage());

2
非常感谢,之前出现了像á这样的奇怪字符,现在已经正常工作了。 - Andreas Reiff
2
这是原始问题中的一个变量。 - Mikael Svenson
如何在您的类中使用代理和DefaultCredentials? - Drag and Drop
1
@PierreLebon 我建议你看一下HttpWebRequest类的可用属性,你会感到惊讶的 :) - Mikael Svenson
1
我在构造函数上进行了重载,并添加到了获取页面请求中。现在未来的读者将会有一个很好的提示,告诉他们如何做。因为当你与编码作斗争时,你可能会错过一些简单的东西。 - Drag and Drop
显示剩余2条评论

16

我遇到了类似的编码问题。通过在我的WebClient初始化中添加以下内容,我已经在HtmlAgilityPack的最新版本中解决了这个问题。

var htmlWeb = new HtmlWeb();
htmlWeb.OverrideEncoding = Encoding.UTF8;
var doc = htmlWeb.Load("www.alfa.lt");

2
为什么只使用HTMLAgilityPack就能完成任务,而不使用WebClient呢?最佳答案。 - a1204773

6

UTF8 对我不起作用,但是像这样设置编码后,大部分我尝试爬取的页面都能正常工作:

web.OverrideEncoding = Encoding.GetEncoding("ISO-8859-1");

也许这会对某些人有所帮助。

谢谢!很奇怪,我一直在调试我的程序,使用HtmWeb web = new HtmlWeb();然后doc = web.Load(nextPageUrl);但它突然停止工作了。我已经测试了几天了。它为什么会停止工作?我有一个抛出自定义异常的bug。但即使在那之后,我多次从调试器重新启动应用程序,它仍然给我带来了奇怪的错误。你的解决方案解决了我的问题。我一直在寻找方法,但没有找到。 - John Foll

5
 HtmlAgilityPack.HtmlDocument doc = new HtmlDocument(); 
 StreamReader reader = new StreamReader(WebRequest.Create(YourUrl).GetResponse().GetResponseStream(), Encoding.Default); //put your encoding            
 doc.Load(reader);

希望这能有所帮助 :)

1

这似乎消除了我需要了解编码的必要性:

using System;
using HtmlAgilityPack;
using System.Net;
using System.IO;


    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Enter the url to pull html documents from: ");

            string url = Console.ReadLine();

            HtmlDocument document = new HtmlDocument();

            var request = WebRequest.Create(url);
            var response = request.GetResponse();

            using (var reader = new StreamReader(response.GetResponseStream()))
            {
                document.LoadHtml(reader.ReadToEnd());
            } 
        }
    }

1
如果所有这些帖子都不起作用,只需使用以下内容:WebUtility.HtmlDecode("您的HTML文本");

1
尝试将其更改为 GodLikeHTML.Load(GodLikeClient.OpenRead("www.alfa.lt"), Encoding.GetEncoding(1257));

抱歉,我给你带来了误导 - 它是用utf编码的。 不过还是感谢你的帮助。 - August

0

这是我的解决方案

 HttpWebRequest request =(HttpWebRequest)WebRequest.Create("http://www.sina.com.cn");
HttpWebResponse response =(HttpWebResponse)request.GetResponse();
long len = response.ContentLength;
byte[] barr = new byte[len]; 
response.GetResponseStream().Read(barr, 0, (int)len); 
response.Close();
string data = Encoding.UTF8.GetString(barr); 
var encod = doc.DetectEncodingHtml(data);
string convstr = Encoding.Unicode.GetString(Encoding.Convert(encod, Encoding.Unicode, barr));
doc.LoadHtml(convstr);

0
更简单的方法(WebClient 似乎没有任何 OverrideEncoding 功能):
using (WebClient webClient = new WebClient())
{
    webClient.Encoding  = Encoding.UTF8;
    // do whatever you want...
}

(在.NET Framework 4.8中对我有效)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接