HtmlAgilityPack WebGet.Load給出錯誤“對象引用未設置為對象的實例”

c# html-agility-pack

我正在開展一個關於從經銷商網站獲取新車價格的項目。我可以獲取大多數網站的HTML。但是當我嘗試加載其中一個時,WebGet.Load(url)方法將Object reference not set to an instance of an object.錯誤。我發現這些網站之間沒有任何差異。

正常工作網址示例:

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

感謝您的幫助。

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

當我使用這個url文件時沒有加載。

熱門答案

實際問題出在HtmlAgilityPack內部。頁面無法使用此元內容類型: <META http-equiv="Content-Type" content="text/html; charset=8859-9">其中charset=8859-9似乎是不正確的。 HAL內部嘗試通過使用類似Encoding.GetEncoding("8859-9")類的東西來獲得該字符串的適當編碼,這會引發錯誤(我認為實際編碼應該是iso-8859-9 )。

實際上你只需要告訴HAL不要讀取HtmlDocument編碼(只是HtmlDocument.OptionReadEncoding = true ),但這似乎是不可能的HtmlWeb.Load (設置HtmlWeb.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"));
    }
}

這樣做,並成功解析頁面。

編輯: @:Simon Mourier:是的,它引發了NullReferenceException因為它捕獲了ArgumentException並在那裡設置了_declaredencoding = null 。然後_declaredencoding.WindowsCodePage行拋出空引用。

這是來自HtmlDocument.cs, ReadDocumentEncoding方法的代碼塊:

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"));
    }
}

這是我的堆棧跟踪:

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"));
    }
}



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因