どのようにC#でHTMLエンコーディングを取得するには?

c# encoding html html-agility-pack webclient

質問

私はウェブ辞書から特定の単語の発音を取得しようとしています。たとえば、次のコードでは、 http://collinsdictionary.comからgoodの発音を取得したい

(ここではHTTP Agility Packを使用しています)

static void test()
{
    String url = "http://www.collinsdictionary.com/dictionary/english/good";
    WebClient client = new WebClient();
    client.Encoding = System.Text.Encoding.UTF8;
    String html = client.DownloadString(url);
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(html);
    HtmlAgilityPack.HtmlNode node = doc.DocumentNode.SelectSingleNode("//*[@id=\"good_1\"]/div[1]/h2/span/text()[1]");
    if (node == null)
    {
        Console.WriteLine("XPath not found.");
    }
    else
    {
        Console.WriteLine(node.WriteTo());
    }
}

私は期待していました

 (É¡ÊŠd

私が最高に得ることができるものは

 (É¡?d

それをどうやって得るの?

受け入れられた回答

問題は、テキストの解析ではなく、むしろコンソール出力の問題です。コマンドラインアプリケーションからこれを行う場合は、コンソールの出力エンコードをUnicodeに設定することができます:

Console.OutputEncoding = System.Text.Encoding.Unicode;

また、コンソールのフォントがUnicodeをサポートするフォントであることを確認する必要があります。詳細については、この回答を参照してください。


人気のある回答

あなたがページエンコーディングを知っているなら(例えばSystem.Text.Encoding.UTF8);

string html = DownloadSmallFiles_String(url, System.Text.Encoding.UTF8, 20000);

自動エンコード検出を使用する(サーバーの応答に依存する)

string html = DownloadSmallFiles_String(url, null, 20000);

最後にhtmlを読み込みます

doc.LoadHtml(html);

以下のコードを試してください

    static void test()
    {
        String url = "http://www.collinsdictionary.com/dictionary/english/good";


        System.Text.Encoding PageEncoding = null; //System.Text.Encoding.UTF8 
        //PageEncoding = null; it means try to detect encoding automatically

        string html = DownloadSmallFiles_String(url, PageEncoding, 20000);


        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();


        //doc.LoadHtml(html);
        doc.LoadHtml(html);

        HtmlAgilityPack.HtmlNode node = doc.DocumentNode.SelectSingleNode("//*[@id=\"good_1\"]/div[1]/h2/span/text()[1]");
        if (node == null)
        {
            Console .WriteLine("XPath not found.");
        }
        else
        {
            Console.WriteLine(node.WriteTo());
        }
    }

    private static HttpWebRequest CreateWebRequest(string url, int TimeOut = 20000)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko";
        request.Method = "GET";
        request.Timeout = TimeOut;
        request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
        request.KeepAlive = false;
        request.UseDefaultCredentials = true;
        request.Proxy = null;//ProxyHelperClass.GetIEProxy;
        return request;
    }

    public static string DownloadSmallFiles_String(string Url, System.Text.Encoding ForceTextEncoding_SetThistoNothingToUseAutomatic, int TimeOut = 20000)
    {
        try
        {
            string ResponsString = "";
            HttpWebRequest request = CreateWebRequest(Url, TimeOut);

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    using (Stream receiveStream = response.GetResponseStream())
                    {
                        if (ForceTextEncoding_SetThistoNothingToUseAutomatic != null)
                        {
                            ResponsString = new StreamReader(receiveStream, ForceTextEncoding_SetThistoNothingToUseAutomatic).ReadToEnd();
                        }
                        else
                        {
                            if (string.IsNullOrEmpty(response.CharacterSet) == false)
                            {
                                System.Text.Encoding respEncoding = System.Text.Encoding.GetEncoding(response.CharacterSet);
                                ResponsString = new StreamReader(receiveStream, respEncoding).ReadToEnd();
                            }
                            else
                            {
                                ResponsString = new StreamReader(receiveStream).ReadToEnd();
                            }
                        }
                    }
                }
            }

            return ResponsString;
        }
        catch (Exception ex)
        {
            return "";
        }
    }


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ