C# WebClient - DownloadString 编码错误

C# WebClient - DownloadString bad encoding

我正在尝试从 Amazon 下载 html 文档,但由于某种原因,我得到了错误的编码字符串,例如“��K��g��g��e”。

这是我试过的代码:

using (var webClient = new System.Net.WebClient())
{
    var url = "https://www.amazon.com/dp/B07H256MBK/";
    webClient.Encoding = Encoding.UTF8;
    var result = webClient.DownloadString(url);
}

使用 HttpClient 时会发生同样的事情:

var url = "https://www.amazon.com/dp/B07H256MBK/";
var httpclient = new HttpClient();
var html = await httpclient.GetStringAsync(url);

我也尝试以字节读取结果,然后将其转换回 UTF-8,但我仍然得到相同的结果。另请注意,这并不总是发生。例如,昨天我 运行 使用此代码约 2 小时,我得到了正确编码的 HTML 文档。但是今天我总是得到一个糟糕的编码结果。它每隔一天发生一次,所以这不是一次性的事情。

=========================================== =====================

然而,当我使用 HtmlAgilitypack 的包装器时,它按预期工作每次:

var url = "https://www.amazon.com/dp/B07H256MBK/";
HtmlWeb htmlWeb = new HtmlWeb();
HtmlDocument doc = htmlWeb.Load(url);

即使我明确定义了正确的编码,是什么导致 WebClient 和 HttpClient 得到错误的编码字符串? HtmlAgilityPack 的包装器在默认情况下是如何工作的?

感谢您的帮助!

我启动了 Firefox 的网络开发工具,请求了该页面,并查看了响应 headers:

看到 content-encoding: gzip 了吗?这意味着响应是 gzip-encoded.

事实证明,即使您 发送 Accept-Encoding: gzip header,亚马逊也会给您一个用 gzip 压缩的响应(已使用其他工具验证) ).这有点顽皮,但并不少见,而且很容易变通。

这根本不是字符编码的问题。 HttpClient 擅长从 Content-Type header.

中找出正确的编码

您可以告诉 HttpClient 到 un-zip 回复:

HttpClientHandler handler = new HttpClientHandler()
{
    AutomaticDecompression = DecompressionMethods.GZip,
};

using (var client = new HttpClient(handler))
{
    // your code
}

如果您使用 NuGet 包版本 4.1.0 到 4.3.2,这将自动设置,否则您需要自己设置。

您可以对 WebClient 执行相同的操作,but it's harder