NullReferenceException в HtmlAgilityPack

Я пытаюсь извлечьlink с помощьюxpath из нижеуказанного URL

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

Мой код:

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

Код выше компилируется нормально, но когда я пытаюсь запустить, он генерирует исключение

<code>Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
</code>

Полная трассировка стека

<code>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
</code>

Итак, мой вопрос, почему я получаю это исключение.

 RanRag14 апр. 2012 г., 11:18
Когда я использую XPath//title/text() это работает нормально, но когда я переключаюсь на выражения xpath, включающие доступ к атрибутам, используя/@href or /@src это не работает.
 nemesv14 апр. 2012 г., 09:57
С версией1.4.3 из HtmlAgilityPack ваш образец работает нормально. Какую версию вы используете?
 RanRag14 апр. 2012 г., 11:17
@nemesv: теперь я использую HtmlAgilityPack ver1.4.3. Теперь я не получаю никакой ошибки, ноConsole.WriteLine(linkNode.InnerText);  не дает никакого выхода и ниlinkNode null, я проверил это.

Ответы на вопрос(1)

Решение Вопроса

который вы пытаетесь проанализировать, содержит<meta http-equiv="Content-Type" content="text/html; charset=iso-utf-8"> гдеcharset значение (iso-utf-8) не может быть обработан AgilityPack как правильное имя кодировки. Как Саймон Мурьесказал, this is a bug introduced in 1.4.0.0.

Чтобы избежать этого, вручную загрузите документ из потока и установите кодировку вручную следующим образом:

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);
    }
}
 RanRag14 апр. 2012 г., 11:29
Я старался.//*[@id='related_search_row'][1]/img/[@src] но это генерирует ошибкуUnhandled Exception: System.Xml.XPath.XPathException: Expression must evaluate to a node-set..
 RanRag14 апр. 2012 г., 11:31
Я нашел обходной путь с помощью xpath.//*[@id='related_search_row'][1]/img чем с помощьюstring val = linkNode.Attributes["src"].Value, Мне было интересно, это единственный способ.
 14 апр. 2012 г., 11:23
@Noob, попробуйте использовать его как & quot; // a [@href] & quot; - используйте квадратные скобки для атрибутов
 RanRag14 апр. 2012 г., 11:20
Когда я использую XPath//title/text() это работает нормально, но когда я переключаюсь на выражения xpath, включающие доступ к атрибутам, используя/@href or /@src это не работает.
 RanRag14 апр. 2012 г., 11:19
Спасибо за ответ. Работало нормально. Теперь я использую HtmlAgilityPack ver1.4.3. Теперь я не получаю никакой ошибки, ноConsole.WriteLine(linkNode.InnerText);  не дает никакого выхода и ниlinkNode null, я проверил это.

Ваш ответ на вопрос