我正在尝试从亚马逊下载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的包装程序默认情况下如何工作?感谢您的帮助!
看到那个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进行同样的操作。