我正在尝试使用C#WebClient下载此网页。 现在它与python urllib2完美配合,但是使用c#web客户端,它会在输出文件中提供这些奇怪的字符。
我也尝试过使用带有webclient类的编码,但它根本不起作用..
public static string GetWebURL()
{
string url = "http://bet.hkjc.com";
WebClient webClient = new WebClient();
webClient.Encoding = Encoding.UTF8;
string html = webClient.DownloadString(url);
File.WriteAllText("page.html", html);
}
这是带有那些奇怪字符的输出
‹âå²Qtñw‰pUðñõQuòñtVPÒÕ×7vÖ×w qÂH˜è*„%æg–dæç%æèë»ú)ÙñrÂ(N.Ê,(Q(©,HµU*IÂ(ÑÃJ,K„ˆ*Ùq)((â€U*TÆ’e‰E ©y‰I9©ŽÉÉ©ÅÅÎùy%Eù9 ¶i‰9Å©Ö %â„¢i Xâ€h"(É-P°U(ÃÃŒKÉ/×ËÉON¹H/£(5M¯¸4©¸¤HÃ\SlHu°kPËœkP¼Ÿ£¯+PP/L‘ÂËœ4&µÂ?MCI_IS®+%?713Ã/17¨ ɘfd!¸ zJšÚ†P«Sò“KsSóJô &MA V¨ŸKòô’RK‚s2ÜŠ€ªô2‹}òÓóó445¡ÊÃ=ÂWâ€Z“˜œ t|zj^jQbN<Ø1z䁚9‰y鶩yJ_ÂP-ˆÔšœchˆe¦‚ µ\H&[×rÙèC’€0ÂJ%à „ ÷‚üüP9Ud¦MÃÃÔÌØÈÖM×ÃÈ25² ÷ô³V·†(ÃŽM-JOM
我该怎么做才能看到正在发送的HTML?
答案 0 :(得分:0)
您正在查看压缩字节流。您可以通过检查http响应的标头来判断,例如使用curl:
curl -X HEAD -i http://bet.hkjc.com/
但浏览器的开发者控制台会显示相同内容:
HTTP/1.1 200 OK Cache-Control: public, max-age=120, must-revalidate Content-Length: 3615 Content-Type: text/html; charset=utf-8 Content-Encoding: gzip Expires: Wed, 29 Jun 2016 08:01:06 GMT Vary: Accept-Encoding Server: Microsoft-IIS/7.0 X-AspNet-Version: 2.0.50727 X-Powered-By: ASP.NET Date: Wed, 29 Jun 2016 08:00:14 GMT Via: 1.1 stjbwbwa52 Accept-Ranges: bytes
请注意Content-Encoding:
说 gzip 。这意味着您刚刚获得的结果是使用gzip算法压缩的。标准WebClient无法处理,但是使用简单的子类,WebClient可以执行新的技巧:
public class DecompressWebClient:WebClient
{
// moved common logic here
public DecompressWebClient()
{
this.Encoding = Encoding.UTF8;
}
// This is the factory to create the webrequest
protected override WebRequest GetWebRequest(Uri address)
{
// get the default one
var request = base.GetWebRequest(address);
// see if it is a HttpWebRequest
var httpReq = request as HttpWebRequest;
if (httpReq != null)
{
// add extra capabilities, like decompression
httpReq.AutomaticDecompression = DecompressionMethods.GZip;
}
return request;
}
}
在HttpWebRequest
上存在一个属性AutomaticDecompression
,当设置为true时,将为我们处理解压缩。
当您使用Subclassed WebClient时,您的代码将如下所示:
string url = "http://bet.hkjc.com";
using(WebClient webClient = new DecompressWebClient())
{
string html = webClient.DownloadString(url);
File.WriteAllText("page.html", html);
}
编码UTF8是正确的,您也可以在标题中看到Content-Type
设置。
html文件的顶部如下所示:
<html> <head> <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7; IE=EmulateIE10"/> <meta name="application-name" content="香港賽馬會"/> <title>香港賽馬會</title>