HtmlAgility проблема - PullRequest
       3

HtmlAgility проблема

0 голосов
/ 08 августа 2011

Я пытаюсь извлечь некоторые данные между div.

<div class="movie_general"><div class="img"><a href="/Movies.html" title="Watch Movie">

Пример для примера, если я хочу ссылку "/Movies.html", которую я использовал:

string hrefValue = doc.DocumentNode
            .Descendants("div")
            .Where(x => x.Attributes["class"].Value == "movie_general")
            .Select(x => x.Element("a").Attributes["href"].Value)
            .FirstOrDefault();

             MessageBox.Show(hrefValue);

но я получаюисключение NullReferenceException в Where (x => x.Attributes ["class"]. Value == "movie_general")

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Это происходит потому, что провайдер Linq должен выполнить итерации по всем остальным узлам документа, чтобы проверить, соответствует ли он вашему поиску.Этот документ должен иметь хотя бы один div, который не имеет атрибута class.Таким образом, ошибка возникает при попытке прочитать свойство Value атрибута, который не существует.

Заменить это

.Where(x => x.Attributes["class"].Value == "movie_general")
.Select(x => x.Element("a").Attributes["href"].Value)

на это

.Where(x => x.Attributes["class"] != null && x.Attributes["class"].Value == "movie_general")
.Select(x => x.Element("a") != null && x.Element("a").Attributes["href"] != null ? x.Element("a").Attributes["href"].Value : string.Empty)
0 голосов
/ 26 октября 2014

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

 HtmlDocument doc = new HtmlDocument();
    doc.Load("C:\\temp\\stackhtml.html");
    string link = doc.DocumentNode.SelectSingleNode("//div[@class='movie_general']//a").GetAttributeValue("href", "unkown");
    Console.WriteLine(link);
    Console.ReadLine();

и результат:

enter image description here

Я добавил закрывающие теги div в ваш пример, чтобы я мог очистить его и поместил в файл на диске c:

<div class="movie_general">
   <div class="img">
      <a href="/Movies.html" title="Watch Movie">
    </div>
</div>
...