2012-04-14 12 views
5

Ich versuche, ein link mit xpath aus der unten genannten URLNullreferenceexception in HtmlAgilityPack

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

Mein Code zu extrahieren:

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

Der obige Code kompiliert gut, aber wenn ich versuche, es erzeugt zu laufen eine Ausnahme

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

Kompletter Stapeltrace

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 

Also, meine Frage ist, warum ich diese Ausnahme bekomme.

+0

Mit der Version '1.4.3' der HtmlAgilityPack Ihrer Probe funktioniert gut. Welche Version verwendest du? – nemesv

+0

@nemesv: Jetzt verwende ich HtmlAgilityPack ver1.4.3. Jetzt bekomme ich keinen Fehler außer 'Console.WriteLine (linkNode.InnerText); 'gibt keine Ausgabe und weder' linkNode' ist null Ich habe das überprüft. – RanRag

+0

Wenn ich xpath '// title/text()' verwende, funktioniert es gut, aber wenn ich zu Xpath-Ausdrücken mit Zugriff auf Attribute über '/ @ href oder/@ src' wechsele, funktioniert es nicht. – RanRag

Antwort

6

Dies ist ein Fehler in HtmlAgilityPack. Das Dokument, das Sie analysieren möchten, hat <meta http-equiv="Content-Type" content="text/html; charset=iso-utf-8">, wobei der charset Wert (iso-utf-8) nicht als gültiger Kodierungsname von AgilityPack analysiert werden konnte. Als Simon Mourier said, ist dies ein Fehler in 1.4.0.0 eingeführt.

dies zu vermeiden, manuell Ihr Dokument aus einem Stream laden und die Codierung manuell wie folgt festgelegt:

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

Danke für die Antwort. Es hat gut funktioniert. Jetzt verwende ich HtmlAgilityPack ver1.4.3. Jetzt bekomme ich keinen Fehler außer 'Console.WriteLine (linkNode.InnerText); 'gibt keine Ausgabe und weder' linkNode' ist null Ich habe das überprüft. – RanRag

+0

Wenn ich xpath '// title/text()' verwende, funktioniert es gut, aber wenn ich zu Xpath-Ausdrücken mit Zugriff auf Attribute über '/ @ href oder/@ src' wechsele, funktioniert es nicht. – RanRag

+0

@Noob, versuche es wie "// a [@href]" - benutze eckige Klammern für Attribute – Alex