C#WebClient-DownloadString错误编码

问题描述 投票:0回答:1

我正在尝试从亚马逊下载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的包装程序默认情况下如何工作?

感谢您的帮助!

c# asp.net .net webrequest webclient-download
1个回答
3
投票
我启动了Firefox的Web开发工具,请求了该页面,并查看了响应标题:

Response headers

看到那个content-encoding: gzip?这意味着响应是gzip编码的。

事实证明,即使您

不发送Accept-Encoding: gzip标头(已通过其他工具验证),Amazon也会为您提供使用gzip压缩的响应。这有点顽皮,但并不罕见,并且很容易解决。

这根本不是字符编码的问题。 HttpClient善于从Content-Type标头中找出正确的编码。

您可以告诉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进行同样的操作。

© www.soinside.com 2019 - 2024. All rights reserved.