gpt4 book ai didi

C# WebClient - DownloadString 编码错误

转载 作者:行者123 更新时间:2023-12-03 04:38:44 27 4
gpt4 key购买 nike

我正在尝试从 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 的网络开发工具,请求该页面,并查看了响应 header :

Response headers

看到内容编码:gzip了吗?这意味着响应是 gzip 编码的。

事实证明,即使您没有发送 Accept-Encoding: gzip header (使用其他工具验证),Amazon 也会为您提供使用 gzip 压缩的响应。这有点顽皮,但并不罕见,而且很容易解决。

这根本不是字符编码的问题。 HttpClient 擅长从 Content-Type header 中找出正确的编码。

您可以告诉 HttpClient 使用以下命令解压缩响应:

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 .

关于C# WebClient - DownloadString 编码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60753996/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com