2012-04-14 24 views
5

Tôi cố gắng để trích xuất một link sử dụng xpath từ url dưới đây đề cậpNullReferenceException trong HtmlAgilityPack

string url = "http://www.album-cover-art.org/search.php?q=Ruin+-+Live+Album+Version+Lamb+of+God" 

Mã của tôi:

HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb(); 
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); 
htmlDoc = web.Load(url); //Exception generated here Line 23 

if (htmlDoc.DocumentNode != null) 
{ 
    HtmlNode linkNode = htmlDoc.DocumentNode.SelectSingleNode(".//*[@id='related_search_row']/img/@src"); 
    if (linkNode != null) 
     Console.WriteLine(linkNode.InnerText); 
} 

Đoạn mã trên biên dịch tốt nhưng khi tôi cố gắng chạy nó tạo ra một ngoại lệ

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object. 

Hoàn thành stacktrace

System.NullReferenceException: Object reference not set to an instance of an object. 
    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.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 1149 
    at HtmlAgilityPack.HtmlWeb.Load(String url) in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlWeb.cs:line 1107 
    at ScreenScrapping.Program.Main(String[] args) in c:\Users\ranveer\csharp\ScreenScrapping\ScreenScrapping\Program.cs:line 23 

Vì vậy, câu hỏi của tôi là lý do tại sao tôi nhận được ngoại lệ này.

+0

Với phiên bản '1.4.3' của mỹ HtmlAgilityPack mẫu của bạn đang làm việc. Bạn sử dụng phiên bản nào? – nemesv

+0

@nemesv: Bây giờ tôi đang sử dụng HtmlAgilityPack ver1.4.3. Bây giờ tôi không nhận được bất kỳ lỗi nào nhưng 'Console.WriteLine (linkNode.InnerText); 'không đưa ra bất kỳ đầu ra nào và không phải' liên kếtNode' là null Tôi đã kiểm tra điều đó. – RanRag

+0

Khi tôi sử dụng xpath '// title/text()' nó hoạt động tốt nhưng khi tôi chuyển sang biểu thức xpath liên quan đến việc thừa nhận các thuộc tính bằng cách sử dụng '/ @ href hoặc/@ src' nó không hoạt động. – RanRag

Trả lời

6

Đây là lỗi trong HtmlAgilityPack. Tài liệu bạn đang cố gắng phân tích có <meta http-equiv="Content-Type" content="text/html; charset=iso-utf-8"> trong đó không thể phân tích cú pháp giá trị charset (iso-utf-8) dưới dạng tên mã hóa hợp lệ của AgilityPack. Như Simon Mourier said, đây là lỗi được giới thiệu trong 1.4.0.0.

Để tránh điều này, bằng tay tải tài liệu của bạn từ một dòng suối và thiết lập mã hóa bằng tay như thế này:

var htmlDoc = new HtmlDocument(); 
htmlDoc.OptionReadEncoding = false; 
var request = (HttpWebRequest)WebRequest.Create(url); 
request.Method = "GET"; 
using (var response = (HttpWebResponse)request.GetResponse()) 
{ 
    using (var stream = response.GetResponseStream()) 
    { 
     htmlDoc.Load(stream, Encoding.UTF8); 
    } 
} 
+0

Cảm ơn câu trả lời. Nó hoạt động tốt. Bây giờ tôi đang sử dụng HtmlAgilityPack ver1.4.3. Bây giờ tôi không nhận được bất kỳ lỗi nào nhưng 'Console.WriteLine (linkNode.InnerText); 'không đưa ra bất kỳ đầu ra nào và không phải' liên kếtNode' là null Tôi đã kiểm tra điều đó. – RanRag

+0

Khi tôi sử dụng xpath '// title/text()' nó hoạt động tốt nhưng khi tôi chuyển sang biểu thức xpath liên quan đến việc thừa nhận các thuộc tính bằng cách sử dụng '/ @ href hoặc/@ src' nó không hoạt động. – RanRag

+0

@Noob, hãy thử sử dụng nó như "// a [@href]" - sử dụng dấu ngoặc vuông cho các thuộc tính – Alex

Các vấn đề liên quan