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。
我正在尝试从 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。