web-dev-qa-db-ja.com

C#およびHtmlAgilityPackエンコードの問題

WebClient GodLikeClient = new WebClient();
HtmlAgilityPack.HtmlDocument GodLikeHTML = new HtmlAgilityPack.HtmlDocument();

GodLikeHTML.Load(GodLikeClient.OpenRead("www.alfa.lt");

したがって、このコードは、「Skaitytojo klausimas psichologui:kas lemiahomoseksualumÄ…?-Naujienųportalas Alfa.lt」の代わりに「Skaitytojo klausimas psichologui:kas lemiahomoseksualumą?-Naujienųportalas Alfa.lt」を返します。

このWebページは1257(バルト)でエンコードされていますが、textBox1.Text = GodLikeHTML.DocumentNode.OuterHtml;は、歪んだテキストを返します-バルト発音区別符号は、いくつかの奇妙ないくつかの長い文字列に変換されます:(

そして、はい、私はHtmlAgilityPackフォーラムを試しました。彼らは吸う。

追伸私はプログラマーではありませんが、コミュニティプロジェクトに取り組んでおり、このコードを機能させる必要があります。ありがとう;}

23
August

実際、ページはUTF-8でエンコードされています。

GodLikeHTML.Load(GodLikeClient.OpenRead("http://www.alfa.lt"), Encoding.UTF8);

動作します。

または、httpヘッダーまたはメタタグからエンコーディングを検出するmy SO answer のコードを使用して、enを適切に再エンコードできます。 (ダウンロードを最小限に抑えるためにgzipもサポートしています)。

ダウンロードクラスを使用すると、コードは次のようになります。

HttpDownloader downloader = new HttpDownloader("http://www.alfa.lt",null,null);
GodLikeHTML.LoadHtml(downloader.GetPage());
25
Mikael Svenson

同様のエンコードの問題がありました。 HtmlAgilityPackの最新バージョンでは、WebClientの初期化に以下を追加することで修正しました。

var htmlWeb = new HtmlWeb();
htmlWeb.OverrideEncoding = Encoding.UTF8;
var doc = htmlWeb.Load("www.alfa.lt");
14
craastad

UTF8は私にとっては機能しませんでしたが、このようにエンコードを設定した後、スクレイピングしようとしているほとんどのページはちょうどうまくいきました:

web.OverrideEncoding = Encoding.GetEncoding( "ISO-8859-1");

多分それは誰かを助けるかもしれません。

5
Tys
 HtmlAgilityPack.HtmlDocument doc = new HtmlDocument(); 
 StreamReader reader = new StreamReader(WebRequest.Create(YourUrl).GetResponse().GetResponseStream(), Encoding.Default); //put your encoding            
 doc.Load(reader);

それが役に立てば幸い :)

5
Sagiv Ofek

それをGodLikeHTML.Load(GodLikeClient.OpenRead("www.alfa.lt"), Encoding.GetEncoding(1257));に変更してみてください

1
Ilia G

これは私のためにエンコーディングについて何かを知る必要性を取り除くように見えました:

using System;
using HtmlAgilityPack;
using System.Net;
using System.IO;


    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Enter the url to pull html documents from: ");

            string url = Console.ReadLine();

            HtmlDocument document = new HtmlDocument();

            var request = WebRequest.Create(url);
            var response = request.GetResponse();

            using (var reader = new StreamReader(response.GetResponseStream()))
            {
                document.LoadHtml(reader.ReadToEnd());
            } 
        }
    }
0
T-CROC

これは私の解決策です

 HttpWebRequest request =(HttpWebRequest)WebRequest.Create("http://www.sina.com.cn");
HttpWebResponse response =(HttpWebResponse)request.GetResponse();
long len = response.ContentLength;
byte[] barr = new byte[len]; 
response.GetResponseStream().Read(barr, 0, (int)len); 
response.Close();
string data = Encoding.UTF8.GetString(barr); 
var encod = doc.DetectEncodingHtml(data);
string convstr = Encoding.Unicode.GetString(Encoding.Convert(encod, Encoding.Unicode, barr));
doc.LoadHtml(convstr);
0
eliprodigy

これらの投稿がすべて機能しない場合は、次のように使用してください:WebUtility.HtmlDecode("Your html text");

0
Ebleme