2011-01-22 14 views
3

私はディーラーのウェブサイトから新しい車の価格を取得するプロジェクトを進めています。私はほとんどのWebサイトhtmlを取得できます。しかし、私はそれらのいずれかを読み込もうとすると、WebGet.Load(url)メソッドはObject reference not set to an instance of an object.エラーを返します。私はこれらのウェブサイトの間に違いを見つけることができませんでした。HtmlAgilityPack WebGet.Loadでエラーが発生するオブジェクト参照がオブジェクトのインスタンスに設定されていません

通常の作業のURL例:問題の

http://www.renault.com.tr/page.aspx?id=1715

http://www.hyundai.com.tr/tr/Content.aspx?id=fiyatlistesi

ウェブサイト:

http://www.fiat.com.tr/Pages/tr/otomobiller/grandepunto_fiyat.aspx 

あなたの助けをいただき、ありがとうございます。

var webGet = new HtmlWeb(); 
var document = webGet.Load("http://www.fiat.com.tr/Pages/tr/otomobiller/grandepunto_fiyat.aspx"); 

このURLドキュメントを使用すると、ドキュメントが読み込まれません。

+0

あなたのコードを投稿することができますか? –

+0

完全なスタックフレームを投稿できますか? –

答えて

2

実際の問題はHtmlAgilityPack内部にあります。ページには、このメタコンテンツタイプがありません:<META http-equiv="Content-Type" content="text/html; charset=8859-9">ここでcharset=8859-9はすばらしいようです。 HAL内部はEncoding.GetEncoding("8859-9")のようなものを使ってこの文字列の適切なエンコーディングを取得しようとしますが、これはエラーを投げます(実際のエンコーディングはiso-8859-9でなければなりません)。

は実際にあなたが必要とするすべてはHtmlDocument(ちょうどHtmlDocument.OptionReadEncoding = true)のエンコーディングを読み取ることではないHALを伝えることですが、これはHtmlWeb.LoadHtmlWeb.AutoDetectEncodingはここで働いていない設定)では不可能であると思われます。だから、この問題を回避するには、URL(最も簡単な方法)のマニュアル読みになることができます:

var document = new HtmlDocument(); 
document.OptionReadEncoding = false; 

var url = 
    new Uri("http://www.fiat.com.tr/Pages/tr/otomobiller/grandepunto_fiyat.aspx"); 
var request = (HttpWebRequest)WebRequest.Create(url); 
request.Method = "GET"; 
using (var response = (HttpWebResponse)request.GetResponse()) 
{ 
    using (var stream = response.GetResponseStream()) 
    { 
     document.Load(stream, Encoding.GetEncoding("iso-8859-9")); 
    } 
} 

これは動作し、成功したページを解析します。

EDIT: @:サイモンMourier:それはArgumentExceptionをキャッチし、そこ_declaredencoding = nullを設定するためはい、それはNullReferenceExceptionを発生させます。そして_declaredencoding.WindowsCodePage行はヌル参照をスローします。

try 
{ 
    _declaredencoding = Encoding.GetEncoding(charset); 
} 
catch (ArgumentException) 
{ 
    _declaredencoding = null; 
} 
if (_onlyDetectEncoding) 
{ 
    throw new EncodingFoundException(_declaredencoding); 
} 

if (_streamencoding != null) 
{ 
    if (_declaredencoding.WindowsCodePage != _streamencoding.WindowsCodePage) 
    { 
     AddError(
      HtmlParseErrorCode.CharsetMismatch, 
      _line, _lineposition, 
      _index, node.OuterHtml, 
      "Encoding mismatch between StreamEncoding: " + 
      _streamencoding.WebName + " and DeclaredEncoding: " + 
      _declaredencoding.WebName); 
    } 
} 

そして、ここに私のスタックトレースです:ここ

ReadDocumentEncoding方法は、HtmlDocument.csからのコードブロックである

System.NullReferenceException was unhandled 
    Message=Object reference not set to an instance of an object. 
    Source=HtmlAgilityPack 
    StackTrace: 
     at HtmlAgilityPack.HtmlDocument.ReadDocumentEncoding(HtmlNode node) in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlDocument.cs:line 1916 
     at HtmlAgilityPack.HtmlDocument.PushNodeEnd(Int32 index, Boolean close) in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlDocument.cs:line 1805 
     at HtmlAgilityPack.HtmlDocument.Parse() in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlDocument.cs:line 1468 
     at HtmlAgilityPack.HtmlDocument.Load(TextReader reader) in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlDocument.cs:line 769 
     at HtmlAgilityPack.HtmlDocument.Load(Stream stream, Boolean detectEncodingFromByteOrderMarks) in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlDocument.cs:line 597 
     at HtmlAgilityPack.HtmlWeb.Get(Uri uri, String method, String path, HtmlDocument doc, IWebProxy proxy, ICredentials creds) in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlWeb.cs:line 1515 
     at HtmlAgilityPack.HtmlWeb.LoadUrl(Uri uri, String method, WebProxy proxy, NetworkCredential creds) in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlWeb.cs:line 1563 
     at HtmlAgilityPack.HtmlWeb.Load(String url, String method) in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlWeb.cs:line 1152 
     at HtmlAgilityPack.HtmlWeb.Load(String url) in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlWeb.cs:line 1107 
     at test.console.Program.Main(String[] args) in W:\Projects\Me\test.console\test.console\Program.cs:line 54 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 
+0

読み取りエンコードの検出でNullReferenceExceptionが発生するのではなく、少なくともHAP 1.3.0.0でArgumentExceptionが発生します。(したがって、完全なスタックフレームについての質問) –

+0

@Simon:スタックトレースで私の答えを更新しました(私のバージョンは1.4.0.0 )。 – Alex

+0

これは1.4.0.0で導入されたバグです。 –

関連する問題