C#WebClient奇怪的人物

时间:2016-06-08 19:13:19

标签: c# python

我正在尝试使用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?

1 个答案:

答案 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>